iOS开发之压缩图片

导读:

iOS 图片压缩方法-
iOS图片压缩处理- 陈斌彬的技术博客

疑问

当我导入一张图片的时候然后读取这张图片的时候发现这张图片通过以下这句代码总是比我们的原图要大,而且有时候大很多,有时候大的不是特别多:

UIImage *image = [UIImage imageNamed:@"kod.jpg"];
NSData * imageData = UIImageJPEGRepresentation(image, 1);
NSLog(@"imageData = %zd",[imageData length]);

那这个时候我就有疑问了,我的原图难道不是最大的吗?所以这个时候就查看一下官方文档看下究竟:

iOS开发之压缩图片_第1张图片
Snip20170828_90.png
compressionQuality  
The quality of the resulting JPEG image, expressed as a value from 0.0 to 1.0. 
The value 0.0 represents the maximum compression (or lowest quality) while the value 1.0 represents the least compression (or best quality).

译文:

压缩质量
JPEG图像的质量的值范围是0.0-1.0
质量值为0时代表的是最大的压缩或者最低的图片质量,当值为1的时候代表的是最低的压缩或者最好的图片质量

经过翻译之后发现好像找到了一点解释,就是说当前这张图片的最好质量并不就是原图,应为原图可能是压缩过的。并且要注意的是当这张图片已经压缩到最差了那就不能够再压缩了,具体是通过什么来评定图片的质量是最差的,这个得问专业人士了...

经过我的实验证明,我现在下载了一张原图,然后原图的质量系数为1的时候写成文件然后再次读取此图片,此新图片的质量系数为1的时候的data大小仍然要比新图大,所以每一张图片的最好质量并不是自己。所以如果我们需要将图片写成文件的话那么就不要返回UIImage了,而是应该返回NSData,当然可以写两个方法:

+ (UIImage *)scaleImage:(UIImage *)image toLength:(NSInteger)maxLength{
    CGFloat compression = 1;
    maxLength *= 1024;
    NSData *data = UIImageJPEGRepresentation(image, compression);
    while (data.length > maxLength && compression > 0) {
        compression -= 0.02;
        data = UIImageJPEGRepresentation(image, compression);
    }
    UIImage *resultImage = [UIImage imageWithData:data];
    return resultImage;
}

这个是之前的方法直接返回的是一个UIImage,如果是我们需要把这个经过压缩的UIImage写成文件的话,那么又需要通过UIImageJPEGRepresentation这个函数去转,这个函数是需要质量系数你不知道多少,所以你得把质量系数传出来这样很麻烦,所以我觉得可以把NSData传出来,然后再在外面转成UIImage或者说写两个方法,返回的类型一个为UIImage,另一个为NSData.

希望这个对大家有帮助!!!

iOS开发之压缩图片_第2张图片
七禾.jpg

你可能感兴趣的:(iOS开发之压缩图片)