为什么这么多记忆?

hpi*_*que 3 android bitmap out-of-memory

我有一个1000x1500像素位图,我想在Android中制作一个可变副本.

当我运行以下代码时......

// int width = original.getWidth(); // 1000px
// int height = original.getHeight(); // 1500px
final Bitmap result = original.copy(original.getConfig(), true);
original.recycle();
Run Code Online (Sandbox Code Playgroud)

......我OutOfMemoryErrorcopy线了:

java.lang.OutOfMemoryError: bitmap size exceeds VM budget
ERROR/GraphicsJNI(419): VM won't let us allocate 6000000 bytes
Run Code Online (Sandbox Code Playgroud)

为什么复制指令需要6MB(!)才能生成1000x1500像素的位图?

如何以更高内存效率的方式从非可变位图创建可变位图?

编辑

BitmapFactory返回不可变位图.显然,从不可变位图创建可变位图的唯一方法是将其复制到新的可变位图中.在1000x1500位图的情况下,这显然需要12MB(1000x1500x4x2),这在大多数Android设备中导致OutOfMemoryError.

这个问题在Android中无法解决吗?

cdo*_*ner 5

回答你的第一个问题:

1000*1500*32/8 = 600万

(32位/像素的颜色信息)

要回答第二个问题:您需要通过以块为单位处理图像来减小图像的大小,或者降低分辨率或颜色深度.


hpi*_*que 5

cdonner让我朝着正确的方向前进.

事实证明原始位图使用的是ARGB_8888,它需要每像素32位,并且超过了这个特定应用所需的数量.

将位图配置更改为RGB_565(每像素需要16位),可将内存消耗减少一半.