• iOS图片处理


          我们常用的图片格式可以分为bmp,jpg,png,gif,webp,其中bmp常用语安卓端开发,iOS常用的是jpg和png,苹果默认是不支持gif图片的,我们拉取gif得到的是一帧帧的图片但是我们可以在工程中用代码生成gif图片,webp是google推出的一种新的图片格式,它的有点是可以将相同质量的图片大小缩减50%甚至更多,webp算法比较复杂,消耗内存较多,但基于其存储占用优势,以后可能会成为主流格式。

       下边先从jpg和png谈起,iOS中我们常用png,因为清晰度相同的两张图片,png是无损的,所占空间更小。

      一、png和jpg相互转化

    //jpg转化png
    -(void)jpgToPng{
        UIImage * image = [UIImage imageNamed:@"1.jpg"];
        
        NSData * data = UIImagePNGRepresentation(image);
        
        UIImage * pngImage =[UIImage imageWithData:data];
        
        UIImageWriteToSavedPhotosAlbum(pngImage, nil, nil, nil);
        
    }
    
    //jpg转化jpg
    -(void)jpgTojpg{
        UIImage * image = [UIImage imageNamed:@"1.jpg"];
        //后一个参数越小,则生成的图片越小,越模糊
        NSData * data = UIImageJPEGRepresentation(image, 0.5);
        
        UIImage * jpgImage =[UIImage imageWithData:data];
        
        UIImageWriteToSavedPhotosAlbum(jpgImage, nil, nil, nil);
        
    }
    
    //png转化png
    -(void)pngToJpg{
        UIImage * image = [UIImage imageNamed:@"2.png"];
        
        NSData * data = UIImageJPEGRepresentation(image, 0.5);
        
        UIImage * jpgImage =[UIImage imageWithData:data];
        
        UIImageWriteToSavedPhotosAlbum(jpgImage, nil, nil, nil);
        
    }

    二、gif图片分解

    gif图片分解的步骤为

    1.拿到gif数据

    2.分帧

    3.将单帧数据转化为图片

    4.保存

    首先我们需要先引入头文件

    
    

    #import <ImageIO/ImageIO.h>

    #import <MobileCoreServices/MobileCoreServices.h>

    //分解gif
    -(void)deCompositionGif{
     //读取gif数据
        NSString * gifResource = [[NSBundle mainBundle]pathForResource:@"1.gif" ofType:nil];
        
        
        NSData * data = [NSData dataWithContentsOfFile:gifResource];
        
       CGImageSourceRef  source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);
        
       //获取gif帧数
        size_t count = CGImageSourceGetCount(source);
        NSLog(@"%ld",count);
        //定义数组,保存单帧图片
        
        NSMutableArray * ImageArr = [NSMutableArray array];
        
    //遍历取出每一帧
        for (size_t i = 0; i<count; i++) {
           
            CGImageRef imageRef = CGImageSourceCreateImageAtIndex(source, i, NULL);
            
            
            //将单帧数据转化为uiimag   scale 图片物理尺寸与屏幕的比例    orientation 图片的方向
            UIImage * image = [UIImage imageWithCGImage:imageRef scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp];
            //保存
            [ImageArr addObject:image];
            //释放
            CGImageRelease(imageRef);
        }
        CFRelease(source);
        //单帧图片保存
        int i  = 0 ;
        for (UIImage * image in ImageArr) {
            i++;
            NSData *  data = UIImagePNGRepresentation(image);
            
            NSArray * path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            NSString * gifPath = path[0];
            
            NSString * pathNumber = [gifPath stringByAppendingString:[NSString stringWithFormat:@"%d.png",i]];
            NSLog(@"%@",pathNumber);
            [data writeToFile:pathNumber atomically:YES];
        }
        
    }

    三.gif展示

     UIImageView * imageView3 =[[UIImageView alloc]initWithFrame:CGRectMake(10, 100, 200, 200)];
        [self.view addSubview:imageView3];
        NSMutableArray * arr = [[NSMutableArray alloc]init];
        
        for (int i = 1; i<9; i++) {
            UIImage * image = [UIImage imageNamed:[NSString stringWithFormat:@"Documents%d",i]];
            
            [arr addObject:image];
        }
        //设置播放属性
        [imageView3 setAnimationImages:arr];
        [imageView3 setAnimationDuration:2];
        [imageView3 setAnimationRepeatCount:10];
        [imageView3 startAnimating];

    四.由帧图片生成gif。

    //创建gif图片
    -(void)creatGif{
    
        //获取gif数据
        NSMutableArray * image =[[NSMutableArray alloc]initWithObjects:[UIImage imageNamed:@"Documents1"],[UIImage imageNamed:@"Documents2"],[UIImage imageNamed:@"Documents3"],[UIImage imageNamed:@"Documents4"],[UIImage imageNamed:@"Documents5"],[UIImage imageNamed:@"Documents6"], nil];
    //创建gif文件
        NSArray * document = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        
        NSString * documentStr = [document objectAtIndex:0];
        
        NSFileManager * manager = [NSFileManager defaultManager];
        NSString * testDic = [documentStr stringByAppendingString:@"/gif"];
        NSString * path = [testDic stringByAppendingString:@"test.gif"];
        [manager createDirectoryAtPath:testDic withIntermediateDirectories:YES attributes:nil error:nil];
    //配置属性
        CGImageDestinationRef destion;
        //将path映射成 CFURLRef 对象
        CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)path, kCFURLPOSIXPathStyle, false);
       
        //url 路径 kUTTypeGIF目标类型
      destion  =    CGImageDestinationCreateWithURL(url, kUTTypeGIF, image.count, nil);
        
        NSDictionary * frameDic = [NSDictionary dictionaryWithObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:0.3], (NSString *)kCGImagePropertyGIFDelayTime,nil] forKey:(NSString *)kCGImagePropertyGIFDelayTime];
        
        NSMutableDictionary * gifParmDic = [NSMutableDictionary dictionaryWithCapacity:3];
        
        [gifParmDic setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCGImagePropertyGIFHasGlobalColorMap];
        
        [gifParmDic setObject:(NSString *)kCGImagePropertyColorModelRGB forKey:(NSString *)kCGImagePropertyColorModel];
        [gifParmDic setObject:[NSNumber numberWithInt:8] forKey:(NSString *)kCGImagePropertyDepth];
        [gifParmDic setObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount];
        NSDictionary * gifProperty = [NSDictionary dictionaryWithObject:gifParmDic forKey:(NSString *)kCGImagePropertyGIFDictionary ];
        //单帧图片添加到gif
        for (UIImage * Dimage  in  image) {
            CGImageDestinationAddImage(destion,Dimage.CGImage, (__bridge CFDictionaryRef)frameDic);
            
               }
        CGImageDestinationSetProperties(destion, (__bridge CFDictionaryRef)gifProperty);
        
        CGImageDestinationFinalize(destion);
        
        CFRelease(destion);
    
    }
  • 相关阅读:
    [WPF VTK]三维图形开发基础(一)
    WP开发(一)
    [WPF VTK]三维图形开发基础(四)

    WIN8 下IE突然无法打开(管理员权限可打开)
    [WPF VTK]三维图形开发基础(三)
    堆排序、快排的坑
    双向链表之插入
    [WPF VTK]三维图形开发基础(二)
    [转载]Android界面设计学习日志(一)
  • 原文地址:https://www.cnblogs.com/xiejw/p/5929463.html
Copyright © 2020-2023  润新知