在我的项目中,我需要操作一个Bitmap并保存它。
为了操作图像,我应用了一个矩阵,如下所示:
Bitmap b = Bitmap.createBitmap(((BitmapDrawable) imageView.getDrawable()).getBitmap(), 0, 0,width, height, matrix, true);
我这样保存:
b.compress(Bitmap.CompressFormat.JPEG, 100, out);
问题在于,如果这样做,如果位图很大,我可能会收到OOM错误。
有关如何避免它的任何建议吗?
不幸的是,缩小Bitmap是不可接受的解决方案,因为我需要保留位图质量。
答案 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。无论如何,它比应用程序崩溃更好。