iOS图片压缩,想必这是一个比较大切值得深入的一个研究。所以太深入的这里我也不会去讲,之所以写这篇,是因为我们在开发中,因为iphone拍照后,直接上传的图片大多数像素比较高,尺寸比较大,一般都在2-3M,所以在手机上传,用户等待时间过于长,同时因为作为手机展示的产品图,也并不需要太高清晰的图片。所以产品要求控制图片在500KB以下。故我写了一个简单的算法以供大家参考。
写这个算法前,公司的安卓同事,告诉我可以参看下安卓有一个现成的luban算法。于是我去搜索了一下,感觉过于麻烦。有兴趣的同学可以搜索一下,这里贴一个介绍的链接:
http://blog.csdn.net/wenyiqingnianiii/article/details/52469342
在这之前,我有搜到一篇简单的对微信图片压缩的博文:
http://blog.csdn.net/u014220518/article/details/58136932
这篇是已1280为界,来对图片进行尺寸的等比压缩的。但是他有一个2的系数,我不太明白这个是从何而来,所以,在我的简单算法中1280为界,但是没有用他的1这个系数。如果有研究的童鞋,可以告知这个2是什么。接下来,先对图片的压缩进行分解介绍。
1.图片压缩的概念理解
既然对图片压缩,那么从文字来分析:
“压” 是指文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降。
“缩” 是指文件的尺寸变小,也就是像素数减少,而长宽尺寸变小,文件体积同样会减小。
所以,在写算法的时候也会将图片分解为这两部分来处理。
2.图片的压缩处理
2.1图片的缩处理
我这里首先用的是缩的处理。
这里我将图片分为三种情况进行处理
1)宽高均大于1280,取较大值等于1280,较大值等比例压缩
2)宽或高一个大于1280,取较大的等于1280,较小的等比压缩
3)宽高均小于1280,压缩比例不变
对于缩的处理,图片是不会失真的,只是变小而已。
+(UIImage *)zipScaleWithImage:(UIImage *)sourceImage{ //进行图像尺寸的压缩 CGSize imageSize = sourceImage.size;//取出要压缩的image尺寸 CGFloat width = imageSize.width; //图片宽度 CGFloat height = imageSize.height; //图片高度 //1.宽高大于1280(宽高比不按照2来算,按照1来算) if (width>1280||height>1280) { if (width>height) { CGFloat scale = height/width; width = 1280; height = width*scale; }else{ CGFloat scale = width/height; height = 1280; width = height*scale; } //2.宽大于1280高小于1280 }else if(width>1280||height<1280){ CGFloat scale = height/width; width = 1280; height = width*scale; //3.宽小于1280高大于1280 }else if(width<1280||height>1280){ CGFloat scale = width/height; height = 1280; width = height*scale; //4.宽高都小于1280 }else{ } //进行尺寸重绘 UIGraphicsBeginImageContext(CGSizeMake(width, height)); [sourceImage drawInRect:CGRectMake(0,0,width,height)]; UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; }
2.2图片的压处理
对于“压”的功能,使用的UIImageJPEGRepresentation或UIImagePNGRepresentation方法实现。
这里我也分了三种关于图片画质的压缩
1)图片大于1M的,将压缩系数调整到0.7
2)图片在0.5M<image<1M,将压缩系数调整到0.8
3)图片小雨0.5M,压缩系数可以写0.9或者1
+(NSData *)zipNSDataWithImage:(UIImage *)sourceImage{ //进行图像的画面质量压缩 NSData *data=UIImageJPEGRepresentation(sourceImage, 1.0); if (data.length>100*1024) { if (data.length>1024*1024) {//1M以及以上 data=UIImageJPEGRepresentation(newImage, 0.7); }else if (data.length>512*1024) {//0.5M-1M data=UIImageJPEGRepresentation(newImage, 0.8); }else if (data.length>200*1024) { //0.25M-0.5M data=UIImageJPEGRepresentation(newImage, 0.9); } } return data; }
两段结合起来
+(NSData *)zipNSDataWithImage:(UIImage *)sourceImage{ //进行图像尺寸的压缩 CGSize imageSize = sourceImage.size;//取出要压缩的image尺寸 CGFloat width = imageSize.width; //图片宽度 CGFloat height = imageSize.height; //图片高度 //1.宽高大于1280(宽高比不按照2来算,按照1来算) if (width>1280||height>1280) { if (width>height) { CGFloat scale = height/width; width = 1280; height = width*scale; }else{ CGFloat scale = width/height; height = 1280; width = height*scale; } //2.宽大于1280高小于1280 }else if(width>1280||height<1280){ CGFloat scale = height/width; width = 1280; height = width*scale; //3.宽小于1280高大于1280 }else if(width<1280||height>1280){ CGFloat scale = width/height; height = 1280; width = height*scale; //4.宽高都小于1280 }else{ } UIGraphicsBeginImageContext(CGSizeMake(width, height)); [sourceImage drawInRect:CGRectMake(0,0,width,height)]; UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); //进行图像的画面质量压缩 NSData *data=UIImageJPEGRepresentation(newImage, 1.0); if (data.length>100*1024) { if (data.length>1024*1024) {//1M以及以上 data=UIImageJPEGRepresentation(newImage, 0.7); }else if (data.length>512*1024) {//0.5M-1M data=UIImageJPEGRepresentation(newImage, 0.8); }else if (data.length>200*1024) { //0.25M-0.5M data=UIImageJPEGRepresentation(newImage, 0.9); } } return data; }
原文来自:https://www.jianshu.com/p/0b1d10cf8f61
文章评论(0)