图片尺寸体积压缩

在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];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容