【问题标题】:Why does Android BitmapFactory.decodeFile() want 4x the memory needed?为什么 Android BitmapFactory.decodeFile() 需要 4 倍所需的内存?
【发布时间】:2020-07-08 21:45:26
【问题描述】:

我有一个 8MB 的 png,当我尝试将其加载到 Android ImageView 中时,我得到一个 OutOfMemoryError,它说它试图分配 32MB 的内存但失败了。

我正在努力更改代码以对图像进行下采样以避免使用过多内存来避免大多数这些问题,因此我不是在寻找有关下采样的答案。我试图理解为什么图像的内存需求高于文件大小所暗示的。

为什么 Android 在加载 png 时尝试分配 4 倍的内存?

我已经设置了我的选项来告诉它不要缩放像素密度:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
options.inScaled = false;

【问题讨论】:

  • 您真的是指存储在文件中的 8MB PNG 吗? PNG是一种压缩图像格式;一个 8MB 的 PNG 绝对是巨大的。图片分辨率是多少?
  • @CommonsWare 是的,一个 8MB 的 png 存储为文件。它是 2848 x 4209 像素。我们有更大的 png 文件(25 MB 或更大,4032 × 5169 像素),我们正在使用下采样从磁盘加载较小的图像,但是如果没有下采样,系统在加载小至 3 MB png 文件的图像时会引发 OOM 错误次。

标签: android android-imageview android-bitmap


【解决方案1】:

它是 2848 x 4209 像素

ARGB_8888 的 4 字节/像素速率下,Bitmap 将是 47,948,928 字节。

图像的磁盘大小代表着一条红鲱鱼。主要文件格式(尤其是 PNG 和 JPEG)被压缩为文件。那不重要。重要的是所需解码图像的分辨率和位深度。

另请注意,您的图片大于大多数 Android 设备的显示分辨率。根据您的用例,您可能希望考虑像 this one 这样可以一次加载和显示部分图像的小部件。

【讨论】:

  • 啊,有道理。并感谢您提供指向下采样/平铺小部件的指针。我不想自己写这样的东西,并且一直在考虑不太理想的解决方案。
猜你喜欢
  • 2010-11-08
  • 2014-05-25
  • 2011-02-13
  • 2011-03-30
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多