BitmapFactory.decodeStream()返回原始比以​​上的位图〜100次(Bitm

2019-07-28 23:45发布

我有168.2KB和1991x1756的PNG图像,并试图将其导入到一个Bitmap使用BitmapFactory.decodeStream() 问题是,我碰到OutOfMemoryError ,其中Bitmap的大小最终被13,657KB。
我不明白的是为什么是该文件的导入,以及如何缓解这种经过这么大。
似乎这OutOfMemoryError问题是非常普遍的解码Bitmap图像,但无法找到一个方法来解决它。 有任何想法吗?

Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, bitmapOptions);

E/AndroidRuntime(10744): java.lang.OutOfMemoryError: bitmap size exceeds VM budget(Heap Size=7815KB, Allocated=3279KB, Bitmap Size=13657KB)

Answer 1:

一个PNG文件被高度压缩,这意味着磁盘上的文件大小远远小于当它包含的所有数据被加载到内存中的那样。
位图是图像,其中每个像素由一个值表示的一个非常简单的表示。 该值的大小取决于当前设置(您可能听说过的32位图像,16个的图像或其中一些共同的尺寸的8个图像)。

要计算表示为需要计算的像素数的位图图像的真实大小,和你有多少位必须为每个像素相乘这一点。
图像是1991x1756像素(3点496 196中的像素总数)。 如果使用ARGB_8888格式你结束了(对于每个颜色/ alpha通道每像素= 4个字节一个字节)加载位图3 496 196 * 4 = 13 984 784字节。

可以通过使用较少的字节/信道(RGB_565例如)尽管这也降低了图像的质量降低的总大小。 一个更好的选择将最有可能是降低图像的大小,或者使用导入inSampleSize在参数BitmapFactory.Options加载一个较小的图像。



Answer 2:

我相信PNG图像被严重压缩,但在Android的位图有每像素4个字节不压缩(ARGB)

所以1991 * 1756 *(4个字节)为约13657 KB

因此,尝试使用较小的图像或insample容量选择位图选项,以减少大小。

看看这篇文章: Android中的位图解码与合适的尺寸



文章来源: BitmapFactory.decodeStream() returns a Bitmap ~100 times more than original