0

我有一个操作位图以将 RGB 格式转换为灰度的例程。

它通常工作正常,但是当我尝试在大小为 1088kb 的位图上使用它时,它给了我这个错误:

java.lang.OutOfMemoryError

我正在使用模拟器。1088kb不是很大的图,怎么会耗尽内存呢?

确切地说,调用有问题的代码的应用程序在后台堆栈上包含另一个 Activity,该 Activity 具有图片缩略图的 ListView。

这是方法:

public Bitmap toGrayscale(Bitmap bmpOriginal)
{        
    int width, height;
    height = bmpOriginal.getHeight();
    width = bmpOriginal.getWidth();    

    Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    Canvas c = new Canvas(bmpGrayscale);
    Paint paint = new Paint();
    ColorMatrix cm = new ColorMatrix();
    cm.setSaturation(0);
    ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
    paint.setColorFilter(f);
    c.drawBitmap(bmpOriginal, 0, 0, paint);
    return bmpGrayscale;
}
4

1 回答 1

3

您在内存中管理位图的效率非常低,并且您可能存在内存泄漏(当您使用完位图或将它们保留在不会被垃圾收集的活动中时不会从内存中释放它们)。Android 开发人员有一个用于正确位图管理的页面:

http://developer.android.com/training/displaying-bitmaps/index.html

您可以尝试增加模拟器上的堆大小。

android模拟器上的内存不足错误,但在设备上没有

监控模拟器上的堆大小:

https://stackoverflow.com/a/7427803/445131

摆脱你的内存泄漏:

哪些 Android 工具和方法最适合查找内存/资源泄漏?

于 2013-02-14T15:10:24.383 回答