手頭一個(gè)項(xiàng)目中需要使用微信 SDK 分享圖片,但遇到了有些圖片分享沒問題有些卻無反應(yīng)的問題,實(shí)際抓取日志發(fā)現(xiàn)微信 SDK 有打印錯(cuò)誤信息,即
checkArgs fail, thumbData is invalid
因?yàn)槠渌麍D片可以正常分享柏靶,那么這句錯(cuò)誤的大致意思就是縮略圖的大小超出限制所以無效,網(wǎng)上給出的各種方案基本都是盡量壓縮圖像以適合微信 SDK 的 32k 字節(jié)數(shù)(實(shí)際上是32768)的分享限制溃论,然而基本都是一棒子打死屎蜓,我在其基礎(chǔ)上進(jìn)行了修改,改為了根據(jù)圖像逐級減少清晰度直到適合微信 32k 字節(jié)數(shù)限制后钥勋,分享即可正常進(jìn)行炬转,具體修改后的算法如下:
private static byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) {
byte[] data = bmpToByteArray(bmp, 100);
if (DEBUGMODE) Log.d(">>>", "zipBitmap: quality=100" + " size=" + data.length);
int i = 100;
while (data.length > '耀') { //請勿問我為啥用 '耀' 這個(gè)字,這問題問微信 SDK 開發(fā)者去笔诵,他就是這么判斷的
if (i > 10) {
i = i - 10;
} else {
i = i - 1;
}
if (i <= 0) {
if (DEBUGMODE)
Log.e(">>>", "zipBitmap: 失敗返吻,很無奈清晰度已經(jīng)降為0,但壓縮的圖像依然不符合微信的要求乎婿,最后size=" + data.length);
break;
}
data = bmpToByteArray(bmp, i);
if (DEBUGMODE) Log.d(">>>", "zipBitmap: quality=" + i + " size=" + data.length);
}
if (needRecycle)
bmp.recycle();
return data;
}
public static byte[] bmpToByteArray(final Bitmap bmp, int quality) {
int i;
int j;
if (bmp.getHeight() > bmp.getWidth()) {
i = bmp.getWidth();
j = bmp.getWidth();
} else {
i = bmp.getHeight();
j = bmp.getHeight();
}
Bitmap localBitmap = Bitmap.createBitmap(i, j, Bitmap.Config.RGB_565);
Canvas localCanvas = new Canvas(localBitmap);
while (true) {
localCanvas.drawBitmap(bmp, new Rect(0, 0, i, j), new Rect(0, 0, i, j), null);
ByteArrayOutputStream localByteArrayOutputStream = new ByteArrayOutputStream();
localBitmap.compress(Bitmap.CompressFormat.JPEG, quality,
localByteArrayOutputStream
);
localBitmap.recycle();
byte[] arrayOfByte = localByteArrayOutputStream.toByteArray();
try {
localByteArrayOutputStream.close();
return arrayOfByte;
} catch (Exception e) {
//F.out(e);
}
i = bmp.getHeight();
j = bmp.getHeight();
}
}
主要過程是從 100% 原圖開始逐級向下減少清晰度嘗試壓縮圖像至 32k 字節(jié)范圍內(nèi)测僵,如果下降到原圖 10% 清晰度時(shí)依然不滿足小于 32k 字節(jié)的條件,則以逐級 1% 遞減清晰度直至 0% 無法壓縮為止谢翎『纯浚基本滿足了大部分圖片壓縮情況的需要,而且不會對原本就符合要求的圖像進(jìn)行“一棒子打死”式的壓縮森逮。
小彩蛋是微信 SDK 中判斷 32k 的條件是通過一個(gè)字來實(shí)現(xiàn)的榨婆,即 '耀',這我也與其保持一致褒侧。
如果不想這么麻煩直接一步搞定良风,可以使用我開源的庫 # WechatHelper
一并提供了 微信登錄、支付闷供、分享的封裝烟央,幫你排坑,更輕松的完成微信功能的開發(fā)歪脏。