当前位置:首页 > 短网址资讯 > 正文内容

微信分享图片压缩问题解决方案

www.ft12.com7年前 (2017-08-18)短网址资讯2929

概述

       在进行微信分享时,遇到微信分享失败的情况,微信分享对于图片的大小有32k的限制,如果大于的话就会导致失败。所以对于图片的压缩进行了调研,最后得出如下解决方案:
1、统一了图片的质量参数为RGB_565;
2、先利用32*1024计算出图片采样率,进行一次长宽比压缩;
3、然后利用compress( CompressFormat format, int     quality,OutputStream stream)压缩成PNG格式;
4、计算此时大小,如果超过32k,则换成JPEG格式进行压缩,通过循环修改quality参数来进行压缩,直到最后图片小于32k结束。


问题背景

      在某些页面调起微信分享时会直接返回失败,但并不是所有的页面都会失败,所以排除是微信分享API的问题。

术语解释

  • A : 透明度

  • R : 红色

  • G : 绿色

  • B : 蓝色

  • Bitmap.Config ARGB_4444:每个像素占四位,即A=4,R=4,G=4,B=4,那么一个像素点占4+4+4+4=16位

  • Bitmap.Config ARGB_8888:每个像素占四位,即A=8,R=8,G=8,B=8,那么一个像素点占8+8+8+8=32位

  • Bitmap.Config RGB_565:每个像素占四位,即R=5,G=6,B=5,没有透明度,那么一个像素点占5+6+5=16位

问题分析

 private void sendReq(IWXAPI iwxapi, BaseReq req) {
    boolean result = iwxapi.sendReq(req);
    if(!result) {
        this.mCallBack.onShareError(this.mActivity, "");
        this.mActivity.finish();
    }

}

由分析可知以上result返回false,在这里是将分享的数据传入分享的API,所以猜测这里应该是参数传入有误,下面是在官网上查看的常见问题(虽然结果返回true,但还是具有参考价值的信息),我们可以看到第三条,检查发送时的缩略图大小是否超过32K,所以微信分享对于图片的大小是有限制的,重新换了一张小点的图,最后分享成功了。

目前的分享流程

从以上流程可以看出来,图片是经过了两次压缩,为什么最后还会有超出大小的情况呢?下面我们来分析一下具体的压缩过程是如何实现的。

/**
* 图片压缩比例计算
*
* @param options  BitmapFactory.Options
* @param minSideLength 小边长,单位为像素,如果为-1,则不按照边来压缩图片
* @param maxNumOfPixels 这张片图片最大像素值,单位为byte,如100*1024
* @return 压缩比例,必须为2的次幂
*/
public static int computeSampleSize(BitmapFactory.Options options,int minSideLength, int maxNumOfPixels) {
int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels);
int roundedSize;
if (initialSize <= 8) {
    roundedSize = 1;
    while (roundedSize < initialSize) {
        roundedSize <<= 1;
    }
} else {
    roundedSize = (initialSize + 7) / 8 * 8;
}
return roundedSize;    

}
/**
* 计算图片的压缩比例,用于图片压缩
* @param options BitmapFactory.Options
* @param minSideLength 小边长,单位为像素,如果为-1,则不按照边来压缩图片
* @param maxNumOfPixels 这张片图片最大像素值,单位为byte,如100*1024
* @return 压缩比例
*/      
private static int computeInitialSampleSize(BitmapFactory.Options options,int minSideLength,int maxNumOfPixels) {

double w = options.outWidth;

double h = options.outHeight;

int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math
        .sqrt(w * h / maxNumOfPixels));
int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(
        Math.floor(w / minSideLength), Math.floor(h / minSideLength));

if (upperBound < lowerBound) {
    return lowerBound;
}

if ((maxNumOfPixels == -1) && (minSideLength == -1)) {
    return 1;
} else if (minSideLength == -1) {
    return lowerBound;
} else {
    return upperBound;
}

}

      以上的方法是安卓源码中处理缩略图大小的计算方法,我们知道图片的inSampleSize必须为2的幂次,如果不是2的幂次,会以接近2的幂次这个数来进行压缩,所以最后计算出来的inSampleSize必然不能很精确的将图片压缩到我们期望的大小,所以当一张图片太大时,可能第一次压缩并没有达到效果,然后再经过第二次压缩之后还是可能会超过32k,这就导致了最终的微信分享失败。
      在我们处理图片的时候发现,会给图片设置质量参数,如下

public static Bitmap makeNormalBitmap(String nativeImagePath,int minSideLength, int maxNumOfPixels){
      return makeNormalBitmap(nativeImagePath, minSideLength, maxNumOfPixels,Bitmap.Config.ARGB_4444);
 }

      目前这里设置成了ARGB_4444,那为什么要设置成这个格式呢?应该设置成什么格式呢?还有第二次压缩bmp.compress(CompressFormat.PNG, 100, output);这里为什么设置成PNG,换成JPEG可以吗?

      针对以上问题,我做了一番测试,分为ARGB_8888(PNG)  ARGB_4444(PNG)  RGB_565(PNG) ARGB_8888(JPEG)  ARGB_4444(JPEG)  RGB_565(JPEG) 分别对图片大小和质量有什么影响。

调研数据分析结果如下:

  • 首先用ARGB_8888 PNG的格式去解析图片,所做实验中,图片最终大小超过32KB的较多,分享失败率较高;

  • 用ARGB_4444 PNG格式去解析时,图片最终大小得到很大减少,但是图片的质量比上面的较差,用肉眼能分辨出来;

  • 用RGB_565 PNG格式去解析,图片大小与ARGB_4444一样,但是图片的质量明显比ARGB_4444较好,与ARGB_8888的效果基本一样;

  • JPEG解析时,图片大小比PNG的较小,正常的图片都显示的效果很好,但不支持透明背景属性,所以对于像58logo这样四周圆弧的图片来说,用JPEG的效果就比PNG的差。

优化后的解决方案

      大部分图片经过前两次压缩都能达到要求,为保证微信分享成功,在第二次压缩后进行判断,如果小于32k就直接分享,如果大于的话就压缩成JPEG格式,通过改变option参数来不断进行压缩,直到满足要求,该方案经过测试已经解决了微信分享失败的问题。

      注意点:在最后一步转换成JPEG格式时会不断修改option参数来进行压缩,图片的质量最后可能会影响,在这种情况下需要server配合换掉该图,从客户端的角度来考虑该方案可以保证分享成功,如果图片失真严重的话就需要考虑换图了。

扫描二维码推送至手机访问。

版权声明:本文由短链接发布,如需转载请注明出处。

本文链接:https://www.ft12.com/article_415.html

分享给朋友:

相关文章

FT12短网址:莆田假海淘黑灰产业一条龙,政企已多次联合打击

FT12短网址:莆田假海淘黑灰产业一条龙,政企已多次联合打击

近日某段视频渠道上的一段视频曝光了包括顺丰速运、圆通速递、申通快递、百世汇通、中通快递、韵达快递在内的快递公司代收点,协助莆田假冒运动鞋厂商假造快递单,虚构海外发货信息。对此,顺丰方面表明,本地假货寄递景象一向存在。顺丰已多次向本地法律部门...

FT12短网址:互联网创业公司如何防御 DDoS 攻击?

知乎网友一:作者:gashero在果壳网任职期间经历过多次DDoS攻击。那种绝望的心情,还历历在目。问题不是你能做什么,而是机房决定了其实你什么都做不了。攻击者是控制一个足够大的分布式集群来发起攻击,各种杂七杂八的包,什么都会有。根本不在乎...

腾讯url.cn团队移动App的网络优化:短链接打开速度优化到原来15%历程

腾讯url.cn团队移动App的网络优化:短链接打开速度优化到原来15%历程

导读:在移动应用开发中,应用上线了只是一个开始,噩梦在后面:手机越用越卡为哪般?手机发烫是为何?谁偷走了用户的钱包?如何瘦成一道闪电?这些问题解决起来都是非常麻烦的,腾讯移动品质中心(url.cn)成立了专项测试团队来解决这些问题。最近几年...

快递利润即将触底,行业何去何从?

快递利润即将触底,行业何去何从?

[ FT12短网址] 随着电子商务的快速发展,快递行业每年的规模也成指数一样爆发,可是社会现状的改变,很显然快递企业正在遇到更大的压力,比较重要的是整个行业利润的下滑以及新一代农民工的崛起。《日本经济新闻》9月24日文章,随着电子商务在华迅...

月活超美国人口十分之一,各大科技巨头纷纷布局,智能音箱背后有何门道?

月活超美国人口十分之一,各大科技巨头纷纷布局,智能音箱背后有何门道?

撰稿|FT12短网址 编辑|短链接 未来生活一定是智能的,科幻小说里曾设想过的场景正一步步变成现实。在这个不可逆转的技术发展趋势里,智能音箱扮演的会是怎样的角色?现阶段的智能音箱及其背后的核心技术发展到了哪一步? 1 写...

人性营销:水果店用微信轻松实现创富

人性营销:水果店用微信轻松实现创富

在松松博客投稿的第一个案例(烟油),是我们实打实做出来的。我也一直有关注近百条评论,大部分网友还是很认可,也有几位有一些怀疑。怀疑是正常的,原因在于我本人并没有把细节和原理讲透彻。那么我今天再给大家分享一个案例:我们小区的水果店是怎么用一年...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。