首页 > 代码库 > iOS图片处理

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 =http://www.mamicode.com/ UIImagePNGRepresentation(image);        UIImage * pngImage =[UIImage imageWithData:data];        UIImageWriteToSavedPhotosAlbum(pngImage, nil, nil, nil);    }//jpg转化jpg-(void)jpgTojpg{    UIImage * image = [UIImage imageNamed:@"1.jpg"];    //后一个参数越小,则生成的图片越小,越模糊    NSData * data = http://www.mamicode.com/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 = http://www.mamicode.com/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 =http://www.mamicode.com/ [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 =http://www.mamicode.com/ 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);}

 

iOS图片处理