图片压缩处理的一个可行解决方法【OC】
2017-09-19 00:00
399 查看
摘要: 图片处理 图片压缩
##描述一下
开发中遇到一个需求,需要通过wifi链接到一款相机内存卡,将图片保存到本地,然后上传服务器,这个功能主要是为了可以方便查看图片,所以图片的大小需要压缩,于是想到的方法有三种,质量压缩,大小压缩,质量和大小共同压缩使用。
上面两种方法虽然可以压缩图片。但是效果不太理想,第一种质量压缩总是无法很准确的压缩到相应大小,第二种尺寸压缩有时候因为所需大小比较小,就造成了图像太过模糊,影响效果,所以最后采用两种方法结合的方式进行压缩,先压缩质量,尽可能保证图片的尺寸不发生变化,如果没有达到压缩要求,再相应的压缩图片尺寸,这样压缩之后就能尽可能的保证图片的清晰度了。
##描述一下
开发中遇到一个需求,需要通过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; }
相关文章推荐
- 一些手机图片压缩处理后会出现旋转问题(三星)的解决方法
- 一些手机图片压缩处理后会出现旋转问题(三星)的解决方法
- css一些东西(这里主要有一个方法就是背景渐变,一般我们处理的时候是用图片)
- Android 异步获取网络图片并处理导致内存溢出问题解决方法
- 用ssh写的一个存储图片的程序,报了一个错,看大家有什么好的解决方法
- 处理图片img src=“链接”地址 404解决方法
- Win7下Bitmap.Clone方法处理CMYK图片OutOfMemory异常的解决办法
- IE6图片加载的一个BUG解决方法
- ora-12154 TNS:"无法处理服务名"的一个解决方法
- JSON格式的特殊字符处理(只要一个方法解决)
- Android 异步获取网络图片并处理导致内存溢出问题解决方法
- 批处理命令篇--配置免安装mysql 5.6.22, 以及1067错误的一个解决方法
- Android 异步获取网络图片并处理导致内存溢出问题解决方法
- ios 处理图片固定其方向的一个方法
- (转)iPhone图片处理:摄像头/相册获取图片,压缩图片,上传服务器,下载,拉伸,方法总结
- ora-12154 TNS:"无法处理服务名"的一个解决方法(转)
- ASP.NET一般处理程序新建一个方法里使用context.Response.Write的解决方法
- Android的Btimap处理大图片解决方法
- 曲线解决CMFCPropertyGridCtrl掩码的bug2009年12月30日 星期三 下午 01:24CMFCPropertyGridCtrl这个控件当用到掩码时,会有问题.解决办法用其他掩码替代.下面是一个IP掩码处理方法.代码如下
- 自己封装的一个Java版图片工具,具备压缩,伸缩变换,透明处理,格式转换等功能.