iOS 图片按比例压缩,指定大小压缩

摘要:
1//以40K大小为例,误差1K为例2UIImage*image=[UIImageimageWithData:[selfcompressImageWithImage:imageaimWidth:200aimLength:40*1024accuracyOfLength:1024]];1、质量压缩方法实现:1/**2*压缩图片质量,返回值为可直接转化成UIImage对象的NSData对象3*aimLength:目标大小,单位:字节4*accuracyOfLength:压缩控制误差范围(+/-),本方法虽然给出了误差范围,但实际上很难确定一张图片是否能压缩到误差范围内,无法实现精确压缩。这也说明了一个问题,NSData的大小不等于UIImage的大小,而png格式的图片比同质量同分辨率的jpg和jpeg格式图片大了数倍。

使用系统方法UIImageJPEGRepresentation(UIimage *image,CGFloat quality)进行图片质量压缩,暂且叫参数quality为压缩比吧,取值范围为0~1。

此压缩并非线性,当quality为0.99时,大致压缩到原图片大小的1/3以内,也就是说你无法通过此方法来把一个图片压缩到原大小的一半。

弄明白这这一点剩下的就好办了,至于实现,根据自己的需去要DIY就行了~

首先声明,以下方法无法实现对图片大小的精确压缩。

1 //以40K大小为例,误差1K为例 
2   UIImage * image = [UIImage imageWithData:[self compressImageWithImage:image aimWidth:200 aimLength:40*1024 accuracyOfLength:1024]];

1、质量压缩方法实现:

1 /**
2 *  压缩图片质量,返回值为可直接转化成UIImage对象的NSData对象
3 *  aimLength: 目标大小,单位:字节(b)
4 *  accuracyOfLength: 压缩控制误差范围(+ / -),本方法虽然给出了误差范围,但实际上很难确定一张图片是否能压缩到误差范围内,无法实现精确压缩。
5  */
6 - (NSData *)compressImageWithImage:(UIImage *)image aimWidth:(CGFloat)width aimLength:(NSInteger)length accuracyOfLength:(NSInteger)accuracy{
7     UIImage * newImage = [self imageWithImage:image scaledToSize:CGSizeMake(width, width * image.size.height /image.size.width)];
8    
9     NSData  * data = UIImageJPEGRepresentation(newImage, 1);
10     NSInteger imageDataLen =[data length];
11     
12     if (imageDataLen <= length +accuracy) {
13         returndata;
14     }else{
15         NSData * imageData = UIImageJPEGRepresentation( newImage, 0.99);
16         if (imageData.length < length +accuracy) {
17             returnimageData;
18 }
19         
20         CGFloat maxQuality = 1.0;
21         CGFloat minQuality = 0.0;
22         int flag = 0;
23         
24         while (1) {
25             CGFloat midQuality = (maxQuality + minQuality)/2;
26             
27             if (flag == 6) {
28                 NSLog(@"************* %ld ******** %f *************",UIImageJPEGRepresentation(newImage, minQuality).length,minQuality);
29                 returnUIImageJPEGRepresentation(newImage, minQuality);
30 }
31             flag ++;
32             
33             NSData * imageData =UIImageJPEGRepresentation(newImage, midQuality);
34             NSInteger len =imageData.length;
35             
36             if (len > length+accuracy) {
37                 NSLog(@"-----%d------%f------%ld-----",flag,midQuality,len);
38                 maxQuality =midQuality;
39                 continue;
40             }else if (len < length-accuracy){
41                  NSLog(@"-----%d------%f------%ld-----",flag,midQuality,len);
42                 minQuality =midQuality;
43                 continue;
44             }else{
45                  NSLog(@"-----%d------%f------%ld--end",flag,midQuality,len);
46                 returnimageData;
47                 break;
48 }
49 }
50 }
51 }
52 

2、压缩尺寸,传入带压缩图片对象以及目标大小即可实现。

 1  //对图片尺寸进行压缩--
 2 -(UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize
 3{
 4UIGraphicsBeginImageContext(newSize);
 5     [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
 6     UIImage* newImage =UIGraphicsGetImageFromCurrentImageContext();
 7UIGraphicsEndImageContext();
 8     returnnewImage;
 9 }

update[2016-2-29]:

今天安卓组的同事提了个bug,说压缩到40K的图片,下载到本地却需要五六百K,拿到这个问题之后想了一下,压缩到40K的数据没有问题,上传之后却五六百K,在压缩和上传的过程中肯定出了什么问题,由于上传操作是另一个同事做的,检查了一下代码才发现上传的PNG格式的图片,问题很可能就在这里了。

因为压缩过后把NSData使用imageWithData:转成了UIImage对象,这一下就把40K左右的图片转成了一两百K的UIImage对象,上传之前需要把UIImage对象转成NSData,他使用UIImagePNGRepresentation这个方法,于是data的大小又上升到五六百K。

于是更改方法,把压缩好的NSData对象直接用于上传,上传的图片格式使用JPEG,通过浏览器打开图片验证之后问题得以解决。这也说明了一个问题,NSData的大小不等于UIImage的大小,而png格式的图片比同质量同分辨率的jpg和jpeg格式图片大了数倍。

下面分享一下项目中用于从zip中读取图片和压缩切割图片的分类,实现从zip中直接读取文件而不解压zip的是第三方类库ZipZap,需要的话可以通过pod search zipzap命令在Github上搜索,分类请点此下载

免责声明:文章转载自《iOS 图片按比例压缩,指定大小压缩》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇10.openldap备份与恢复图论及其应用——图下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#实现图片的无损压缩

/// <summary> /// 图像缩略图处理 /// </summary> /// <param name="bytes">图像源数据</param> /// <param name="compression">压缩质量 1-100</param> /// <param...

GIF/PNG/JPG和WEBP/base64/apng图片优点和缺点整理

  GIF/PNG/JPG/WEBP/APNG都是属于位图(位图 ,务必区别于矢量图);   GIF/PNG和JPG这三种格式的图片被广泛应用在现今的互联网中,gif曾在过去互联网初期慢速的情况下几乎是做到了大一统的地位,而现如今随着互联网技术应用和硬件条件的提高,png和jpg格式的图片越来越多的被应用,gif昔日的辉煌一去不复, webp图片格式现在还...

使用 opencv 将图片压缩到指定文件尺寸

前言 图片压缩应用很广泛,如生成缩略图等。前期我在进行图片处理的过程中碰到了一个问题,就是如何将图片压缩到指定尺寸,此处尺寸指的是生成图片文件的大小。 我使用 opencv 进行图片处理,于是想着直接使用 opencv 进行图片压缩处理, opencv 本身包含了压缩到指定像素大小的方法,奈何寻找了很多方法均不能压缩到指定文件尺寸,于是自己在思考后写出了此...

Java压缩图片

阅读目录 前言 压缩的要求 实现 优点 其他功能 前言 作为靠谱的java服务端程序员,图片这个事情一直是个头疼的事情。 现在很多网站上,都有上传图片这个功能,而图片对于现在的很多手机来说,拍摄出来的都是高清图片,分辨率也是相当的高,当然占用的存储空间也就大了。问题也就产生了,你每个用户都上传个3M的图片怎么办? 但是显然现在硬盘的存放空间是不值钱的...

vue脚手架配置插件image-webpack-loader 图片压缩

vue脚手架配置插件image-webpack-loader 图片压缩 插件名称image-webpack-loader 插件文档地址 vuecli配置文档 我遇到的问题 前言:由于没仔细看文档,被坑的挺惨的,网上有很多关于此插件的资料但大多数是粘贴复制的 关于此插件要和file-loader结合使用,不用担心vue使用的url-loader插件...

php图片压缩

php图片压缩 能对图片的大小、质量进行压缩。 <?php class ThumbHandler {     var $dst_img;// 目标文件     var $h_src; // 图片资源句柄     var $h_dst;// 新图句柄     var $h_mask;// 水印句柄     var $img_create_quality...