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

Posted

技术标签:

【中文标题】BitmapFactory.decodeStream() 返回的位图是原始位图的 100 倍【英文标题】:BitmapFactory.decodeStream() returns a Bitmap ~100 times more than original 【发布时间】:2012-04-14 19:30:56 【问题描述】:

我有一个 168.2KB 和 1991x1756 的 PNG 图像,并尝试使用 BitmapFactory.decodeStream() 将其导入到 Bitmap。问题是我遇到了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)

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

因此请尝试使用较小的图像或 insample size Options 的位图选项来减小尺寸。

看看这个帖子: Decoding bitmaps in Android with the right size

【讨论】:

以上是关于BitmapFactory.decodeStream() 返回的位图是原始位图的 100 倍的主要内容,如果未能解决你的问题,请参考以下文章