在iOS开发中,相信大家都遇到过这样的需求:将拍照的照片压缩处理一下,然后再上传到服务器。
当然,可能也有一些app要求原图上传的,只是这种太耗流量且很耗时,如果在网络一不佳的状态下,上传失败的可能性相当大,这可能会失去一部分用户!
首先,我们必须明确图片的压缩其实是两个概念:
1."压"是指文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能会降低。
2."缩"是指文件的尺寸变小,像素数减少,尺寸变小,质量同样会降低
图片“压”处理
//对于“压”的功能,我们可以使用UIImageJPEGRepresentation或UIImagePNGRepresentation方法实现,如:
NSData *imgData = UIImageJPEGRepresentation(image, 0.5);
//第一个参数是图片对象,第二个参数是压的系数,其值范围为0~1。
//UIImagePNGRepresentation(UIImage \*image)要比UIImageJPEGRepresentation(UIImage* image, 1.0)返回的图片数据量大很多.
为了是图片体积尽量小于指定的大小,我们可以遍历UIImageJPEGRepresentation 的质量参数。
UIImage *myimage = [UIImage imageNamed:@"org.PNG"];
NSData *data=UIImageJPEGRepresentation(myimage, 1.0);
float qulity = 1;
NSData *minData = [NSData dataWithData:imagedata];
while (data.length > 200 * 1024 && qulity >= 0.2) {
qulity -= 0.1;
data = UIImageJPEGRepresentation(myimage, quality);
if (imagedata.length < minData.length) {
minData = imagedata;
}
}
if (imagedata.length > 50 * 1024) {
imagedata = minData;
}
图片缩处理
//等比例压缩到指定宽度
- (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;
}
代码实例
需求:将图片压缩到指定尺寸,并压缩到不大于200kb。
UIImage *myimage = [UIImage imageNamed:@"org.PNG"];
//尺寸压缩
UIImage *scaleImage = [self compressImage:myimage toTargetWidth:320];
//质量压缩
NSData *data=UIImageJPEGRepresentation(scaleImage, 1.0);
float qulity = 1;
NSData *minData = [NSData dataWithData:imagedata];
while (data.length > 200 * 1024 && qulity >= 0.18) {
qulity -= 0.1;
data = UIImageJPEGRepresentation(scaleImage, quality);
if (imagedata.length < minData.length) {
minData = imagedata;
} NSLog(@"%ld",(long)(data.length / 1024.0));
}
if (imagedata.length > 50 * 1024) {
imagedata = minData;
}
// 显示在view上
UIImageView *view = [[UIImageView alloc] initWithImage:scaleImage];
view.center = self.view.center;
[self.view addSubview:view];