您的位置:首页 > 移动开发 > IOS开发

iOS图片处理

2016-10-03 22:24 423 查看
我们常用的图片格式可以分为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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: