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

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

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

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

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

1、质量压缩方法实现:

 /**
* 压缩图片质量,返回值为可直接转化成UIImage对象的NSData对象
* aimLength: 目标大小,单位:字节(b)
* accuracyOfLength: 压缩控制误差范围(+ / -),本方法虽然给出了误差范围,但实际上很难确定一张图片是否能压缩到误差范围内,无法实现精确压缩。
*/
- (NSData *)compressImageWithImage:(UIImage *)image aimWidth:(CGFloat)width aimLength:(NSInteger)length accuracyOfLength:(NSInteger)accuracy{
UIImage * newImage = [self imageWithImage:image scaledToSize:CGSizeMake(width, width * image.size.height / image.size.width)]; NSData * data = UIImageJPEGRepresentation(newImage, );
NSInteger imageDataLen = [data length]; if (imageDataLen <= length + accuracy) {
return data;
}else{
NSData * imageData = UIImageJPEGRepresentation( newImage, 0.99);
if (imageData.length < length + accuracy) {
return imageData;
} CGFloat maxQuality = 1.0;
CGFloat minQuality = 0.0;
int flag = ; while () {
CGFloat midQuality = (maxQuality + minQuality)/; if (flag == ) {
NSLog(@"************* %ld ******** %f *************",UIImageJPEGRepresentation(newImage, minQuality).length,minQuality);
return UIImageJPEGRepresentation(newImage, minQuality);
}
flag ++; NSData * imageData = UIImageJPEGRepresentation(newImage, midQuality);
NSInteger len = imageData.length; if (len > length+accuracy) {
NSLog(@"-----%d------%f------%ld-----",flag,midQuality,len);
maxQuality = midQuality;
continue;
}else if (len < length-accuracy){
NSLog(@"-----%d------%f------%ld-----",flag,midQuality,len);
minQuality = midQuality;
continue;
}else{
NSLog(@"-----%d------%f------%ld--end",flag,midQuality,len);
return imageData;
break;
}
}
}
}

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

   //对图片尺寸进行压缩--
-(UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize
{
UIGraphicsBeginImageContext(newSize);
[image drawInRect:CGRectMake(,,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}

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 图片按比例压缩,指定大小压缩的更多相关文章

  1. Zip文件压缩(加密||非加密||压缩指定目录||压缩目录下的单个文件||根据路径压缩||根据流压缩)

    1.写入Excel,并加密压缩.不保存文件 String dcxh = String.format("%03d", keyValue); String folderFileName ...

  2. PHP 图片操作(按照指定尺寸压缩,按照比例裁剪)

    提供二个常用的图片处理方法: 1.按照指定的尺寸压缩图片 /** * 按照指定的尺寸压缩图片 * @param $source_path 原图路径 * @param $target_path 保存路径 ...

  3. iOS图片按比例显示

    只需加这么一段代码,如下: imageView.contentMode = UIViewContentModeScaleAspectFit; imageView.autoresizesSubviews ...

  4. iOS学习——图片压缩到指定大小以内

    一.图片压缩简述 在我们开发过程中,有可能会遇到拍照.或者从相册中选择图片,要么单选或者多选,然后上传图片到服务器,一般情况下一张图片可能3-4M,如果类似微信朋友圈上传9张图片大约是 35M左右,如 ...

  5. C# 图片超过指定大小将压缩到指定大小不失真

    using System;using System.Collections.Generic;using System.Drawing;using System.Drawing.Drawing2D;us ...

  6. C# 压缩图片到指定宽度,假如图片小于指定宽度 判断图片大小是否大于指定大小(KB) 如果大于则压缩图片质量 宽高不变

    class Program { static void Main(string[] args) {//G:\zhyue\backup\projects\Test\ConsoleApplication1 ...

  7. iOS 图片大小压缩 图片尺寸处理

    图片的压缩其实是俩概念,1.是 “压” 文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降,2.是 “缩” 文件的尺寸变小,也就是像素数减少.长宽尺寸变小,文件体积同样会减小. 这个 UII ...

  8. vue+element-ui upload图片上传前大小超过4m,自动压缩到指定大小,长宽

    最近项目需要实现一个需求,用户上传图片时,图片大小超过4M,长宽超过2000,需要压缩到400k,2000宽高.在git上找到一个不错的方法,把实现方法总结一下: 安装image-conversion ...

  9. iOS图片压缩

    项目中常会遇到,上传图片的操作,由于iPhone手机直接拍照的图片往往比较大,一般3-4M,如果直接上传不做处理会浪费用户很多流量,再者有很多场景并不需要高清图片,所以在上传图片前对图片进行压缩,是很 ...

随机推荐

  1. jquery,javascript常用

    1.jquery ajax应用 ajax方式 $.ajax({ url: 'stat.php', type: 'POST', data:{Name:"keyun"}, dataTy ...

  2. Java笔记(二)……Hello world!

    编写源文件 将Java代码编写到扩展名为.java的文件中,此文件称为源文件. 1: class Hello 2: { 3: public static void main(String[] args ...

  3. Windows Azure中对映像的管理及操作

    映像是用作新虚拟机的创建模板的 .vhd 文件.映像是一个模板,因为它与已配置的虚拟机不同,没有计算机名称和用户帐户设置等特定设置.可以通过 Windows Azure 管理门户使用现有映像,或创建您 ...

  4. c++学习_1

    最近重新捧起了<Effective c++>,其中味道又有不同,这里记录之... 这篇文章记录一下public继承的知识点... (1)public继承的意义 该继承方式是代表is-a(是 ...

  5. Docker系列(二)组件介绍

    镜像 镜像是一个只读的模版,可以用来创建Docker容器. 容器 Docker利用容器来运行应用,容器是从镜像创建的运行实例.它可以被启动.开始.停止.删除.每个容器都是互相隔离的,保证安全的平台.可 ...

  6. deep learning(1)BP神经网络原理与练习

    具体原理参考如下讲义: 1.神经网络 2.反向传导 3.梯度检验与高级优化 看完材料1和2就可以梳理清楚bp神经网络的基本工作原理,下面通过一个C语言实现的程序来练习这个算法 //Backpropag ...

  7. HDOJ-ACM1021(JAVA)

    题意: 斐波拉契数列的另外一个变型,如果F(n)能被3整除,则输出yes,否则输出no.(n<1000000) 解题思路: 看到(n<1000000)这个条件,有点感觉递归量有点大,因此要 ...

  8. uva_12535 - Probability Through Experiments

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  9. java dubug调试

    摘要:调试不仅可以查找到应用程序缺陷所在,还可以解决缺陷.对于Java程序员来说,他们不仅要学会如何在Eclipse里面开发像样的程序,更需要学会如何调试程序.本文介绍了Java程序员必知的10个调试 ...

  10. mac下firefox复制粘贴失效解决办法

    现象:复制粘贴只能在firefox上操作,也就是其他应用内的内容无法复制到firefox,firefox的内容也无法复制其他应用,但是firefox自己的内容可以复制本身(比如各个tab页之间复制) ...