1

我有一个关于使用 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)

我希望有人能够阐明这个问题。

最好的,彼得

4

2 回答 2

4

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

我有类似的问题:我正在加载一个具有 8MB 原始格式的图像,但是,为它分配了 32MB。后来我发现这是由 dpi 缩放引起的。如果您的图像在“drawable”文件夹中,它将根据当前屏幕 dpi 自动缩放。我有一个 XHDPI 屏幕,所以我的图像水平缩放 2 倍,垂直缩放 2 倍,这就是它占用 4 倍更多内存的原因。

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

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

于 2012-11-08T14:26:39.720 回答
0

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

您可以控制如何使用 BitmapFactory.Options 加载图像

于 2012-08-29T08:32:42.217 回答