iOS 上传图片压缩处理

作者: 淇水朱华 | 来源:发表于2017-04-24 11:56 被阅读2964次

iOS图片压缩,想必这是一个比较大切值得深入的一个研究。所以太深入的这里我也不会去讲,之所以写这篇,是因为我们在开发中,因为iphone拍照后,直接上传的图片大多数像素比较高,尺寸比较大,一般都在2-3M,所以在手机上传,用户等待时间过于长,同时因为作为手机展示的产品图,也并不需要太高清晰的图片。所以产品要求控制图片在500KB以下。故我写了一个简单的算法以供大家参考。
写这个算法前,公司的安卓同事,告诉我可以参看下安卓有一个现成的luban算法。于是我去搜索了一下,感觉过于麻烦。有兴趣的同学可以搜索一下,这里贴一个介绍的链接:
http://blog.csdn.net/wenyiqingnianiii/article/details/52469342
在这之前,我有搜到一篇简单的对微信图片压缩的博文:
http://blog.csdn.net/u014220518/article/details/58136932
这篇是已1280为界,来对图片进行尺寸的等比压缩的。但是他有一个2的系数,我不太明白这个是从何而来,所以,在我的简单算法中1280为界,但是没有用他的1这个系数。如果有研究的童鞋,可以告知这个2是什么。接下来,先对图片的压缩进行分解介绍。

1.图片压缩的概念理解

既然对图片压缩,那么从文字来分析:
“压” 是指文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降。
“缩” 是指文件的尺寸变小,也就是像素数减少,而长宽尺寸变小,文件体积同样会减小。
所以,在写算法的时候也会将图片分解为这两部分来处理。

2.图片的压缩处理

2.1图片的缩处理

我这里首先用的是缩的处理。
这里我将图片分为三种情况进行处理

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));
    [sourceImage drawInRect:CGRectMake(0,0,width,height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

2.2图片的压处理

对于“压”的功能,使用的UIImageJPEGRepresentation或UIImagePNGRepresentation方法实现。
这里我也分了三种关于图片画质的压缩

1)图片大于1M的,将压缩系数调整到0.7
2)图片在0.5M<image<1M,将压缩系数调整到0.8
3)图片小雨0.5M,压缩系数可以写0.9或者1
+(NSData *)zipNSDataWithImage:(UIImage *)sourceImage{
    //进行图像的画面质量压缩
    NSData *data=UIImageJPEGRepresentation(sourceImage, 1.0);
    if (data.length>100*1024) {
        if (data.length>1024*1024) {//1M以及以上
            data=UIImageJPEGRepresentation(newImage, 0.7);
        }else if (data.length>512*1024) {//0.5M-1M
            data=UIImageJPEGRepresentation(newImage, 0.8);
        }else if (data.length>200*1024) {
            //0.25M-0.5M
            data=UIImageJPEGRepresentation(newImage, 0.9);
        }
    }
    return data;
}

两段结合起来

+(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));
    [sourceImage drawInRect:CGRectMake(0,0,width,height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    //进行图像的画面质量压缩
    NSData *data=UIImageJPEGRepresentation(newImage, 1.0);
    if (data.length>100*1024) {
        if (data.length>1024*1024) {//1M以及以上
            data=UIImageJPEGRepresentation(newImage, 0.7);
        }else if (data.length>512*1024) {//0.5M-1M
            data=UIImageJPEGRepresentation(newImage, 0.8);
        }else if (data.length>200*1024) {
            //0.25M-0.5M
            data=UIImageJPEGRepresentation(newImage, 0.9);
        }
    }
    return data;
}

相关文章

  • iOS 上传图片压缩处理

    iOS图片压缩,想必这是一个比较大切值得深入的一个研究。所以太深入的这里我也不会去讲,之所以写这篇,是因为我们在开...

  • [iOS] iOS 中使用 UIImage 的注意点

    iOS 处理图片的一些小 Tip App图片压缩裁剪原理和上传方案,以及那些有趣的事儿...

  • iOS 图片上传处理 图片压缩 图片处理

    提到从摄像头/相册获取图片是面向终端用户的,由用户去浏览并选择图片为程序使用。在这里,我们需要过UIImagePi...

  • IOS 图片上传处理 图片压缩 图片处理

    提到从摄像头/相册获取图片是面向终端用户的,由用户去浏览并选择图片为程序使用。在这里,我们需要过UIImagePi...

  • iOS 图片压缩方法

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

  • Vue上传图片压缩的问题

    上传图片太大,需要前台进行图片压缩上传图片大于100* 1024 的用canvas 来压缩来解决然后IOS拍照上传...

  • vue 图片压缩

    vue 图片压缩 上传图片大于100* 1024 的用canvas 来压缩来解决 然后IOS拍照上传会有图片旋转的...

  • vue 图片压缩

    vue 图片压缩 上传图片大于100* 1024 的用canvas来压缩来解决 然后IOS拍照上传会有图片旋转的问...

  • 2015-10-16图片压缩,MD5校验去重

    ios客户端上传图片的时候,如果图片过大,通常会压缩后上传, UIImageJPEGRepresentation(...

  • 阿里云(I)

    参考资料:iOS 阿里云服务器图片上传iOS录制(或选择)视频,压缩、上传(整理)视频 拍摄 与压缩 阿里云OSS...

网友评论

  • 冰三尺:假如我使用UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), NO, 0);来生成图片, 图片就会很大, 经过下面的 if (data.length>100*1024) {
    }
    图片还是很大, 但是如果把if 该我while , 就会一直执行压缩, 会把内存耗尽, 然后程序挂掉
  • AAA_9a4c:data.length返回的单位不是bit? 不是 1M= 1024K=1024*8bit 怎么会是 1M= 1024K=1024*1024
    YANGWW:1M = 1024KB = 1024Byte * 1024Byte = 1024Byte * 1024Byte * 8Bit
  • 7a946bf5d2ca:图片10Mb的话 你压缩系数还是0.7 不符合产品需求
  • 舒耀:压缩之后 图片会变色
    淇水朱华:@舒耀 这个就不清楚了,是有些,还是所有呢,这个我之前一直就这样用的没问题的。代码只是对长宽进行了修改,是不是压缩画质的时候出得问题呢?
    舒耀:@淇水朱华 图片 的颜色 原来是蓝的,上传后变成黄色了 整个图片
    淇水朱华:怎么一个变色呢?
  • 57d19a44c38f:代码写错了,宽度大于高度并且宽度大于1280,应该是宽度固定,而不是高度固定。
    淇水朱华:@付_晨曦 改了呢
    付晨曦:@淇水朱华 改过了吗?
    淇水朱华:@哎哟呦 是的呢,这个代码后来有改,我没更新,就一直放着了。改一下我
  • niuxinghua:请教下 缩处理的算法有研究过吗
    淇水朱华:@niuxinghua 这个倒是没研究过
    niuxinghua:@淇水朱华 类似于jpeg之类的压缩编码
    淇水朱华:@niuxinghua 缩处理是指?

本文标题:iOS 上传图片压缩处理

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