美文网首页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图片压缩----中的‘压’和‘缩’

    1、图片的“压”和“缩”概念 “压” 是指文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降。“缩” 是...

  • iOS 压缩图片

    前言: 压缩图片其实不是一个动作,而是两个:“压”和“缩” 压:损失图片的质量,直观的感觉就是清晰度下降缩:缩小图...

  • iOS-图片解压缩相关

    SDWebimage中对图片的解压缩 谈谈 iOS 中图片的解压缩 iOS 开发:绘制像素到屏幕 探讨iOS 中图...

  • 探讨iOS 中图片的解压缩到渲染过程

    探讨iOS 中图片的解压缩到渲染过程 探讨iOS 中图片的解压缩到渲染过程

  • iOS 图片压缩方法

    iOS 图片压缩方法 更多图片处理方法见图片组件 BBWebImage iOS 图片压缩方法 两种图片压缩方法 两...

  • imageView的处理

    图片的处理参见谈谈 iOS 中图片的解压缩

  • iOS编程截取图片和压缩图片

    1.图片的压缩 1、是 “压” 文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降2、是 “缩” 文件的...

  • iOS 图片压缩、滤镜、剪切、渲染等解析

    iOS 图片压缩、滤镜、剪切、渲染等解析 iOS 图片压缩、滤镜、剪切、渲染等解析

  • 无损压缩图片,哈夫曼算法

    1.使用libjpeg进行图片压缩(哈夫曼算法,无损压缩) 2、压缩过程是耗时操作,必须在子线程中调用 3、图片压...

  • iOS 图片压缩处理

    1、确图片的压缩的概念: “压” 是指文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降。“缩” 是指文...

网友评论

    本文标题:iOS图片压缩----中的‘压’和‘缩’

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