【问题标题】:Bitmap.createBitmap outofmemoryerrorBitmap.createBitmap outofmemory 错误
【发布时间】:2014-02-09 16:15:12
【问题描述】:

我在 Horizo​​ntalScrollView 中有一个 RelativeLayout,对象是捕获整个视图(比屏幕宽)。这是我使用的:

thelayout = (RelativeLayout) findViewById(R.id.thelayout);
bitmap = Bitmap.createBitmap(thelayout.getWidth(), thelayout.getHeight(), Config.ARGB_8888);
Canvas c = new Canvas(bitmap);
thelayout.draw(c);

然后我显示位图,一切都很好,除非 RelativeLayout 有很多小部件,然后我在 Bitmap.createBitmap 上收到 OutOfMemoryError。

在正常情况下,我们可以在使用位图之前调整它的大小或压缩它,例如当图像来自文件系统或相机时,使用 Bitmap.createScaledBitmap 和 BitmapFactory.Options。

但是由于 createBitmap 的尺寸必须是 Horizo​​ntalScrollView 内的 RelativeLayout 以确保我捕获整个屏幕,我找不到任何东西来克服 OutOfMemoryError。

有什么想法吗?

更新

我更改为 RGB_565 但仍然是同样的问题。记录猫报告

02-12 10:11:10.897: E/AndroidRuntime(22958): java.lang.OutOfMemoryError: bitmap size exceeds VM budget(Heap Size=17927KB, Allocated=13569KB, Bitmap Size=1046KB)

但是,如果我从堆大小中取出分配,我剩下 4358。但位图大小是 1046,所以它不应该工作,还是我没有正确解释日志?

【问题讨论】:

  • 你试过用Config.RGB_565代替Config.ARGB_8888吗?这将使位图的内存需求减半。
  • 不知道,我试试看。我认为这会以某种方式降低位图?
  • 降级是一个强词 :) 它会降低可用的颜色范围,所以是的,它会对图像的视觉质量产生影响。然而,它不会在图像中引入任何类型的伪影或模糊。唯一会高度可见的真实区域是平滑渐变 - 在 16 位颜色下会变得不那么平滑。

标签: android bitmap out-of-memory horizontalscrollview


【解决方案1】:

请注意,我在这里的建议只是在一定程度上掩盖了问题,但您可以尝试在清单中的应用程序标签中添加以下行:

android:largeHeap="true"

对于某些设备,这可能会给您更多的堆空间来分配位图。

【讨论】:

  • 嗨 Josh,我需要支持许多使用 3.0 之前的 Android 版本的用户,其中 largeHeap 标志无效。谢谢你的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
相关资源
最近更新 更多