美文网首页React Native开发小白iOS开发小知识
iOS图片压缩----中的‘压’和‘缩’

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

作者: 天方夜歌 | 来源:发表于2018-05-23 15:46 被阅读4次
     开发的同志们对图片压缩都不陌生,几乎涵盖所有的APP中,
     最常见的图片上传也要求我们做压缩,对图片的大小做控制,比如2M以内, 
     800*1280等
    

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

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

    2、图片的压处理

    对于“压”的功能,使用的UIImageJPEGRepresentation或UIImagePNGRepresentation方法实现。
    这里我也分了三种关于图片画质的压
    1)图片大于2M的,将压缩系数调整到0.7
    2)图片在0.5M<image<2M,将压缩系数调整到0.8
    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图片压缩----中的‘压’和‘缩’

        本文链接:https://www.haomeiwen.com/subject/wavrjftx.html