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);

}

 

posted @ 2016-10-03 22:24  羽若其  阅读(1273)  评论(0编辑  收藏  举报