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


    使用系统方法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         return data;
    14     }else{
    15         NSData * imageData = UIImageJPEGRepresentation( newImage, 0.99);
    16         if (imageData.length < length + accuracy) {
    17             return imageData;
    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                 return UIImageJPEGRepresentation(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                 return imageData;
    47                 break;
    48             }
    49         }
    50     }
    51 }
    52 

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

     1  //对图片尺寸进行压缩--
     2 -(UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize
     3 {
     4     UIGraphicsBeginImageContext(newSize);
     5     [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
     6     UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
     7     UIGraphicsEndImageContext();
     8     return newImage;
     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上搜索,分类请点此下载

  • 相关阅读:
    Tensorflow揭秘
    今日Q群:QQ群众群友反馈问题的归纳总结
    新闻:小娜来了 微软语音助手正式入华
    原创:如何统计并过滤行中单元格有颜色的值
    转载:案例用Excel对会员客户交易数据进行RFM分析
    转载:推荐给每个“数据分析师”看的PPT——关于开会的那点事
    原创:XXX公司-基于SAP的库存管理系统解决方案
    原创:如何实现在Excel通过循环语句设置指定行的格式
    原创:用VBA实现将鼠标选择的单元格按照指定格式合并并复制到剪切板
    原创:《Excel在零售及电商行业数据化管理中的应用》之“什么是数据化管理?
  • 原文地址:https://www.cnblogs.com/mmhc/p/4975586.html
Copyright © 2020-2023  润新知