BitmapFactory.decodeStream()返回比原始位图大100倍的位图

时间:2012-04-14 19:30:56

标签: android bitmap out-of-memory filesize bitmapfactory

我有一张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)

2 个答案:

答案 0 :(得分:4)

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

要计算表示为位图的图像的真实大小,您必须计算像素数,然后将其乘以每个像素的位数。
您的图片是1991x1756像素(总共 3 496 196 像素)。如果使用ARGB_8888格式加载位图(每个颜色/ alpha通道一个字节=每个像素4个字节),最终会得到3 496 196 * 4 = 13 984 784 个字节。

您可以使用更少的字节/通道(例如RGB_565)来减小总大小,但这也会降低图像的质量。更好的选择很可能是缩小图片的大小,或者使用BitmapFactory.Options中的inSampleSize参数导入图片以加载较小的图片。

答案 1 :(得分:1)

我相信PNG图像被大量压缩,但android中的位图未压缩,因为每像素有4个字节(ARGB)

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

因此,请尝试使用较小的图像或样本大小的位图选项选项来缩小尺寸。

看一下这篇文章: Decoding bitmaps in Android with the right size