BitMapFactory.decodeStream尝试在小图像上分配超过20 MB

时间:2012-08-29 07:35:27

标签: android image bitmap heap

我在使用bitmapfactory.decodestream从互联网上加载图片时遇到了问题。例如这个图像: https://portal.apprenticexm.nl/appportal/public/apps/1/media/807162_88149365.jpg

它的大小刚刚超过100 KB,但bitmapfactory.decodestream上的错误表示我尝试分配超过20 MB: 引起:java.lang.OutOfMemoryError:位图大小超过VM预算(堆大小= 8007KB,分配= 3662KB,位图大小= 23756KB)

我希望有人能够解决这个问题。

最佳, 彼得

2 个答案:

答案 0 :(得分:4)

正如Alex Orlov所说:“磁盘上的大小与内存中位图的大小无关。在第一种情况下,图像被压缩,另一方面,位图只是一组原始像素。”然而,即使考虑将其存储为原始图像,20MB仍然太多了。如果我们考虑每像素4B,那将是5Mpix图像,但是你发布的那个图像肯定更小。

我遇到了类似的问题:我正在加载原始格式为8MB的图像,但是为此分配了32MB。我后来发现这是由dpi缩放引起的。如果您的图像位于“可绘制”文件夹中,它将根据当前屏幕dpi自动缩放。我有一个XHDPI屏幕,因此我的图像水平缩放2倍,垂直缩放2倍,这就是为什么它需要4倍的内存。

您可以在此处找到有关dpi如何工作的更多信息:http://developer.android.com/guide/practices/screens_support.html

如果您不想使用此自动Android功能并自行缩放图像,只需将“drawable”文件夹重命名为“drawable-nodpi”即可。 “drawable”文件夹中标记为“nodpi”的所有图像都将按原样加载。

答案 1 :(得分:0)

磁盘上的大小与内存中的位图大小无关。在第一种情况下,图像被压缩,另一方面,位图只是一组原始像素。您还必须考虑图像配置等内容。如果我没记错,jpg不支持alpha通道,因此比Android的默认配置ARGB_8888更轻量级

您可以使用BitmapFactory.Options

控制如何加载图像