iOS图片压缩处理
理解概念
首先,我们必须明确图片的压缩其实是两个概念:
- “压” 是指文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降。
- “缩” 是指文件的尺寸变小,也就是像素数减少,而长宽尺寸变小,文件体积同样会减小。
图片“压”处理
对于“压”的功能,我们可以使用UIImageJPEGRepresentation
或UIImagePNGRepresentation
方法实现,如:
1
2
3
|
NSData *imgData = UIImageJPEGRepresentation(image, 0.5);
|
第一个参数是图片对象,第二个参数是压的系数,其值范围为0~1。
UIImageJPEGRepresentation方法的官方注释是:
return image as JPEG. May return nil if image has no CGImageRef or invalid bitmap format. compression is 0(most)..1(least)
关于PNG和JPEG格式压缩
UIImageJPEGRepresentation
函数需要两个参数:图片的引用和压缩系数而UIImagePNGRepresentation
只需要图片引用作为参数.UIImagePNGRepresentation(UIImage \*image)
要比UIImageJPEGRepresentation(UIImage* image, 1.0)
返回的图片数据量大很多.
同样的一张照片, 使用UIImagePNGRepresentation(image)
返回的数据量大小为199K
,而UIImageJPEGRepresentation(image, 1.0)
返回的数据量大小只为140K
,比前者少了59K
.
如果对图片的清晰度要求不是极高,建议使用UIImageJPEGRepresentation
,可以大幅度降低图片数据量.比如,刚才拍摄的图片,通过调用UIImageJPEGRepresentation(image, 1.0)
读取数据时,返回的数据大小为140K
,但更改压缩系数为0.5
再读取数据时,返回的数据大小只有11K
,大大压缩了图片的数据量,而且清晰度并没有相差多少,图片的质量并没有明显的降低。因此,在读取图片数据内容时,建议优先使用UIImageJPEGRepresentation
,并可根据自己的实际使用场景,设置压缩系数,进一步降低图片数据量大小。
提示:压缩系数不宜太低,通常是0.3~0.7,过小则可能会出现黑边等。
我们看一下笔者收集的UIImageJPEGRepresentation
的数据表:
笔者统计了iphone
设备上的全屏图和原始图在压缩前和压缩后的大小,我们需要根据图片压缩后在PC上的清晰度来决定最终选择哪个压缩系数。
图片“缩”处理
通过[sourceImage drawInRect:CGRectMake(0, 0, targetWidth, targetHeight)]
可以进行图片“缩”的功能。如下是笔者对图片尺寸缩的api
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
/*!
* @author 杜建超, 15-12-01 16:12:01
*
* 压缩图片至目标尺寸
*
* @param sourceImage 源图片
* @param targetWidth 图片最终尺寸的宽
*
* @return 返回按照源图片的宽、高比例压缩至目标宽、高的图片
*/
- (UIImage *)compressImage:(UIImage *)sourceImage toTargetWidth:(CGFloat)targetWidth {
CGSize imageSize = sourceImage.size;
CGFloat width = imageSize.width;
CGFloat height = imageSize.height;
CGFloat targetHeight = (targetWidth / width) * height;
UIGraphicsBeginImageContext(CGSizeMake(targetWidth, targetHeight));
[sourceImage drawInRect:CGRectMake(0, 0, targetWidth, targetHeight)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
|
我们对图片只“压”而不缩,有时候是达不到我们的需求的。因此,适当地对图片“缩”一“缩“尺寸,就可以满足我们的需求。
iOS图片压缩处理的更多相关文章
- UIImage 和 iOS 图片压缩UIImage / UIImageVIew
UIImageView 制作气泡 stretchableImageWithLeftCapWidth http://blog.csdn.net/justinjing0612/article/detail ...
- iOS 图片压缩方法
iOS 图片压缩方法 两种图片压缩方法 两种压缩图片的方法:压缩图片质量(Quality),压缩图片尺寸(Size). 压缩图片质量 NSData *data = UIImageJPEGReprese ...
- iOS图片压缩上传
本文实例为大家分享了iOS实现压缩图片上传功能,供大家参考,具体内容如下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2 ...
- iOS图片压缩
项目中常会遇到,上传图片的操作,由于iPhone手机直接拍照的图片往往比较大,一般3-4M,如果直接上传不做处理会浪费用户很多流量,再者有很多场景并不需要高清图片,所以在上传图片前对图片进行压缩,是很 ...
- iOS图片压缩问题
对于压缩的处理我给出的建议是 先判断 图片的大小,如果是本地图片最好用nsfilemanager 来判断 .如果不能用这个判断的话 就只能先将图片转成data,然后再判断了. 图片转成data 当然就 ...
- iOS 图片压缩
+ (UIImage *)scaleFromImage:(UIImage *)image { CGSize newSize = CGSizeMake(366, 366); //目标图片的大小 ...
- jquery mobile上传图片完整例子(包含ios图片横向问题处理和C#后台图片压缩)
上传图片本身是个基本的小功能,但是到了移动端就不那么简单了,相信找到这篇文章的你一定有深深的同感. 本文实例是:在(移动端)页面中点击图片,然后选择文件,然后保存.使用Asp.net 难点一:后台获取 ...
- js 前端图片压缩+ios图片角度旋转
step1:读取选择的图片,并转为base64: function ImgToBase64 (e, fn) { // 图片方向角 //fn为传入的方法函数,在图片操作完成之后执行 var Orient ...
- 图片上传前 压缩,base64图片压缩 Exif.js处理ios拍照倒置等问题
曾写过在前端把图片按比例压缩不失真上传服务器的前端和后台,可惜没有及时做总结保留代码,只记得js利用了base64位压缩和Exif.js进行图片处理,还有其中让我头疼的ios拍照上传后会倒置等诸多问题 ...
随机推荐
- 《Getting Started with Storm》章节一 基础
注:括号里的字,并且是(灰色)的,是我个人的理解,如有差错,欢迎交流 Storm是一个分布式的.可靠的.容错的数据流处理系统(流式计算框架,可以和mapreduce的离线计算框架对比理解).整个任务被 ...
- ASP.net的url重写
http://blog.csdn.net/windok2004/article/details/2432691 1. 有关于URL的重写,本文也只是拿来主意.相继有MS的组件“URLRewriter” ...
- unity awake start 的区别
void Awake (){ } //初始化函数,在游戏开始时系统自动调用.一般用来创建变量之类的东西. void Start(){ } //初始化函数,在所有Awake函数运行完之后(一般是这样,但 ...
- BZOJ3468 : 滑雪
根据公式$x^k=\sum_{i=1}^k Stirling2(k,i)i!C(x,i)$, 设$f[i][j][k]$表示从$(i,j)$出发的所有路径的$C(路径长度,k)$的和, 根据$C(n, ...
- Leap Motion发布新平台,直击下一代移动端VR/AR手部追踪
2013年,动作捕捉技术公司Leap Motion发布了面向PC的体感控制器,不过销量并不乐观.随着2014年虚拟现实技术的再一次兴起,它发布一款用于Oculus Rift的附加设备,从而正式登上VR ...
- Grunt vs Gulp
grunt vs gulp 虽然gulp已经出来很久了,但是一直没有去使用过.得益于最近项目需要,就尝试了一下,以下从几个要点讲一下grunt和gulp使用的区别,侧重讲一下在使用gulp过程中发现的 ...
- KMP算法 hdu4686 Oulipo
Problem Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, w ...
- UIAlertView 与 UIActionSheet (提示用户)的使用方法
UIAlertView 提示用户 帮助用户选择框 // UIAlertView *alterView = [[UIAlertView alloc] initWithTitle:@"警 ...
- 创建需要计时器的windows service
1.在VS中建立windows service后,应该添加一个安装程序. 2.在默认的Service1.cs设计界面右键,添加安装程序,生成ProjectInstaller.包含两个类serviceP ...
- 让 cell 显示底部线条时,总是有几个线条被隐藏.
一,经历 1> 感觉像是重用的问题,但从代码的分析中找不出任何问题. 2> 感觉像是我 在创建怎样的 cell 的代码 被 layoutsubviews 方法覆盖了一样.于是先在创建怎样的 ...