iOS图片压缩----中的‘压’和‘缩’

 开发的同志们对图片压缩都不陌生,几乎涵盖所有的APP中,
 最常见的图片上传也要求我们做压缩,对图片的大小做控制,比如2M以内, 
 800*1280等

1、图片的“压”和“缩”概念

“压” 是指文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降。
“缩” 是指文件的尺寸变小,也就是像素数减少,而长宽尺寸变小,文件体积同样会减小。

2、图片的压处理

对于“压”的功能,使用的UIImageJPEGRepresentation或UIImagePNGRepresentation方法实现。
这里我也分了三种关于图片画质的压
1)图片大于2M的,将压缩系数调整到0.7
2)图片在0.5M 3)图片小于0.5M,压缩系数可以写0.9或者1,我这里小于0.5的不压

注意:系数不要写的太小,会失真严重

-(NSData *)zipNSDataWithImage:(UIImage *)sourceImage{
    //进行图像的画面质量压
    NSData *data=UIImageJPEGRepresentation(sourceImage, 1.0);
//
    if (data.length>512*1024) {
        if (data.length>2 * 1024*1024) {//2M以及以上 
            data=UIImageJPEGRepresentation(newImage, 0.7);
        }else  {//0.5M-2M
            data=UIImageJPEGRepresentation(newImage, 0.8);
        }
    }else {
            //data=UIImageJPEGRepresentation(newImage, 0.9);
            data=UIImageJPEGRepresentation(newImage, 1.0);
        }
    return data;
}

3、图片的缩处理

这里我将图片分为三种情况进行处理
1)宽高均大于1280,取较大值等于1280,较大值等比例压缩
2)宽或高一个大于1280,取较大的等于1280,较小的等比压缩
3)宽高均小于1280,压缩比例不变

对于缩的处理,图片是不会失真的,只是变小而已。

-(UIImage *)zipScaleWithImage:(UIImage *)sourceImage{
    //进行图像尺寸的压缩
    CGSize imageSize = sourceImage.size;//取出要压缩的image尺寸
    CGFloat width = imageSize.width;    //图片宽度
    CGFloat height = imageSize.height;  //图片高度
    //1.宽高大于1280(宽高比不按照2来算,按照1来算)
    if (width>1280||height>1280) {
        if (width>height) {
            CGFloat scale = height/width;
            width = 1280;
            height = width*scale;
        }else{
            CGFloat scale = width/height;
            height = 1280;
            width = height*scale;
        }
    //2.宽大于1280高小于1280
    }else if(width>1280||height<1280){
        CGFloat scale = height/width;
        width = 1280;
        height = width*scale;
    //3.宽小于1280高大于1280
    }else if(width<1280||height>1280){
        CGFloat scale = width/height;
        height = 1280;
        width = height*scale;
    //4.宽高都小于1280
    }else{
    }

//进行尺寸重绘
   // UIGraphicsBeginImageContext(CGSizeMake(width, height));
UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), NO, [UIScreen mainScreen].scale);//强烈建议使用这种方法
    [sourceImage drawInRect:CGRectMake(0,0,width,height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

4、图片的压缩

将压和缩结合在一起

-(NSData *)zipNSDataWithImage:(UIImage *)sourceImage{
    //进行图像尺寸的压缩
    CGSize imageSize = sourceImage.size;//取出要压缩的image尺寸
    CGFloat width = imageSize.width;    //图片宽度
    CGFloat height = imageSize.height;  //图片高度
    //1.宽高大于1280(宽高比不按照2来算,按照1来算)
    if (width>1280||height>1280) {
        if (width>height) {
            CGFloat scale = height/width;
            width = 1280;
            height = width*scale;
        }else{
            CGFloat scale = width/height;
            height = 1280;
            width = height*scale;
        }
    //2.宽大于1280高小于1280
    }else if(width>1280||height<1280){
        CGFloat scale = height/width;
        width = 1280;
        height = width*scale;
    //3.宽小于1280高大于1280
    }else if(width<1280||height>1280){
        CGFloat scale = width/height;
        height = 1280;
        width = height*scale;
    //4.宽高都小于1280
    }else{
    }
    //UIGraphicsBeginImageContext(CGSizeMake(width, height));
UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), NO, [UIScreen mainScreen].scale);//强烈建议使用这种方法
    [sourceImage drawInRect:CGRectMake(0,0,width,height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    //进行图像的画面质量压缩
    NSData *data=UIImageJPEGRepresentation(newImage, 1.0);
    if (data.length>512*1024) {
        if (data.length>2 * 1024*1024) {//2M以及以上
            data=UIImageJPEGRepresentation(newImage, 0.7);
        }else {//0.5M-2M
            data=UIImageJPEGRepresentation(newImage, 0.8);
        }
    }else{
        //data=UIImageJPEGRepresentation(newImage, 0.9);
    data=UIImageJPEGRepresentation(newImage, 1.0);
}
    return data;
}

参考:https://www.jianshu.com/p/0b1d10cf8f61?from=groupmessage

你可能感兴趣的:(iOS图片压缩----中的‘压’和‘缩’)