little-snow-fox / react-native-wechat-lib

🚀 WeChat login, share, favorite and payment for React-Native on iOS and Android
MIT License
673 stars 134 forks source link

android bitmapResizeGetBytes 压缩算法问题(新) #120

Open songzuyun opened 3 years ago

songzuyun commented 3 years ago

我当前遇到一张1.8M的图片, 版本1.1.23。在bitmapResizeGetBytes方法里,其中下面这段代码的 image.getHeight() / image.getWidth() 280,应该要改成 image.getHeight() 280 / image.getWidth() ,否则计算结果可能是0,最后的结果是闪退。

return bitmapResizeGetBytes(Bitmap.createScaledBitmap(image, 280, image.getHeight() / image.getWidth() * 280, true), size);

private static byte[] bitmapResizeGetBytes(Bitmap image, int size) { // little-snow-fox 2019.10.20 ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 质量压缩方法,这里100表示第一次不压缩,把压缩后的数据缓存到 baos image.compress(Bitmap.CompressFormat.JPEG, 100, baos); int options = 100; // 循环判断压缩后依然大于 32kb 则继续压缩 while (baos.toByteArray().length / 1024 > size) { // 重置baos即清空baos baos.reset(); if (options > 10) { options -= 8; } else { return bitmapResizeGetBytes(Bitmap.createScaledBitmap(image, 280, image.getHeight() / image.getWidth() * 280, true), size); } // 这里压缩options%,把压缩后的数据存放到baos中 image.compress(Bitmap.CompressFormat.JPEG, options, baos); } return baos.toByteArray(); }

Aromxyz commented 3 years ago

( image.getHeight() 1f / image.getWidth() ) 280