图片压缩处理的一个可行解决方法【OC】


声明:本文转载自https://my.oschina.net/snOS/blog/1539666,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

##描述一下 开发中遇到一个需求,需要通过wifi链接到一款相机内存卡,将图片保存到本地,然后上传服务器,这个功能主要是为了可以方便查看图片,所以图片的大小需要压缩,于是想到的方法有三种,质量压缩,大小压缩,质量和大小共同压缩使用。

质量压缩方法

   UIImageJPEGRepresentation(<#UIImage * _Nonnull image#>, <#CGFloat compressionQuality#>) 

大小压缩

//压缩图片为指定大小 - (UIImage *)scaleToSize:(UIImage *)img size:(CGSize)size {     // 并把它设置成为当前正在使用的context     UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);     // 绘制改变大小的图片     [img drawInRect:CGRectMake(0,0, size.width, size.height)];     // 从当前context中创建一个改变大小后的图片     UIImage* scaledImage =UIGraphicsGetImageFromCurrentImageContext();     // 使当前的context出堆栈     UIGraphicsEndImageContext();     //返回新的改变大小后的图片     return scaledImage; } 

上面两种方法虽然可以压缩图片。但是效果不太理想,第一种质量压缩总是无法很准确的压缩到相应大小,第二种尺寸压缩有时候因为所需大小比较小,就造成了图像太过模糊,影响效果,所以最后采用两种方法结合的方式进行压缩,先压缩质量,尽可能保证图片的尺寸不发生变化,如果没有达到压缩要求,再相应的压缩图片尺寸,这样压缩之后就能尽可能的保证图片的清晰度了。

质量大小压缩相结合

- (UIImage *)compressSizeAndQualityImage:(UIImage *)image toByte:(NSUInteger)maxLength {     CGFloat compressQuality = 1;     NSData *data = UIImageJPEGRepresentation(image, compressQuality);     if (data.length < maxLength) {     //质量小于压缩大小         return image;     }    /*压缩质量*/     //指定大小压缩比例     compressQuality = (CGFloat)maxLength/(CGFloat)data.length;     data = UIImageJPEGRepresentation(image, compressQuality);     UIImage *resultImage = [UIImage imageWithData:data];     if (data.length < maxLength) {     //质量小于压缩大小         return resultImage;     }    /*压缩大小*/     NSUInteger lastDataLenth = 0;     while (data.length > maxLength && data.length != lastDataLenth) {         lastDataLenth = data.length;         //计算压缩比例         CGFloat compressSize = (CGFloat) maxLength/(CGFloat)data.length;         CGSize size = CGSizeMake((NSUInteger)(resultImage.size.width * sqrtf(compressSize)), (NSUInteger)(resultImage.size.height * sqrtf(compressSize)));         UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);         [resultImage drawInRect:CGRectMake(0, 0, size.width, size.height)];         resultImage = UIGraphicsGetImageFromCurrentImageContext();         UIGraphicsEndImageContext();                data = UIImageJPEGRepresentation(resultImage, 1);     }     return resultImage;      }  

本文发表于2017年09月19日 12:37
(c)注:本文转载自https://my.oschina.net/snOS/blog/1539666,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2090 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1