iOS-微信朋友圈图片压缩算法

描述

图片作为App中重要的一个元素,非常具有表现力,图片既要让用户能看清楚,又能让发布图片的用户能快速的上传。所以开发者要对图片进行裁切和质量压缩。但是裁切尺寸质量压缩比设置成多少却很难控制好,如果设置不当会导致图片显示效果很差。


微信是一个很好的参照物,被大家广为使用并接受。这个扩展就是通过发送微信朋友圈和聊天会话发送了大量图片,对比原图与微信压缩后的图片逆向推算出来的压缩算法。

算法

图片尺寸
宽高均 <= 1280,图片尺寸大小保持不变
宽或高 > 1280 && 宽高比 <= 2,取较大值等于1280,较小值等比例压缩
宽或高 > 1280 && 宽高比 > 2 && 宽或高 < 1280,图片尺寸大小保持不变
宽高均 > 1280 && 宽高比 > 2,取较小值等于1280,较大值等比例压缩
注:当宽和高均小于1280,并且宽高比大于2时,微信聊天会话和微信朋友圈的处理不一样。
朋友圈:取较小值等于1280,较大值等比例压缩
聊天会话:取较小值等于800,较大值等比例压缩

图片质量

经过大量的测试,微信的图片压缩质量值 ≈ 0.5


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,压缩比例不变

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


-(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;

作者:淇水朱华
链接:https://www.jianshu.com/p/0b1d10cf8f61
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值