Android:修改并保存Bitmap,如何避免OOM?

时间:2016-01-23 21:33:21

标签: android bitmap

在我的项目中,我需要操作一个Bitmap并保存它。

为了操作图像,我应用了一个矩阵,如下所示:

Bitmap b = Bitmap.createBitmap(((BitmapDrawable) imageView.getDrawable()).getBitmap(), 0, 0,width, height, matrix, true);

我这样保存:

b.compress(Bitmap.CompressFormat.JPEG, 100, out);

问题在于,如果这样做,如果位图很大,我可能会收到OOM错误。

有关如何避免它的任何建议吗?

不幸的是,缩小Bitmap是不可接受的解决方案,因为我需要保留位图质量。

1 个答案:

答案 0 :(得分:1)

我还有一些使用Bitmaps的OOM,特别是在旧版(Samsung)设备上。您可以使用的一种简单方法是捕获OOM,启动GC然后再试一次。如果再次失败,您可以(例如)向用户显示错误消息。

private void compressBitmap(/* args */) {
    Bitmap b = Bitmap.createBitmap(((BitmapDrawable) imageView.getDrawable()).getBitmap(), 0, 0,width, height, matrix, true);
    b.compress(Bitmap.CompressFormat.JPEG, 100, out);
}

try {
    compressBitmap(/* args */);
} catch(OutOfMemoryError e) {
    System.gc();
    // try again
    try {
        compressBitmap(/* args */);
    } catch(OutOfMemoryError e) {
        System.gc();
        // Inform user about the error. It's better than the app crashing
    }
}

然而,这只是一种解决方法。如果你真的想在这种情况下有效地防止OOM,我认为你必须使用NDK。无论如何,它比应用程序崩溃更好。