Android BitmapFactory decodeResource Out of Memory Exception

时间:2016-01-10 23:16:35

标签: android android-image android-bitmap android-file bitmapfactory

我是Android新手,正在开发一款可将大图像从可绘制文件夹保存到手机存储空间的应用程序。这些文件的分辨率为2560x2560,我希望保存这些文件而不会丢失图像质量。

我使用以下方法保存图像,它给了我内存异常。我已经看到很多答案如何有效地加载大位图。但我真的找不到这个问题的答案。

在我的代码中,我使用

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), imageId);
File file = new File(root.getAbsolutePath() + "/Pictures/" + getResources().getString(R.string.app_name) + "/" + timeStamp + ".jpg");
file.createNewFile();
FileOutputStream oStream = new FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 100, oStream);
oStream.close();
bitmap.recycle();

我的代码有什么问题吗?对于较小的图像,这没有任何例外。

如果我使用android:largeHeap="true",则不会抛出任何异常。但我知道使用android:largeHeap="true"不是一个好习惯。

有没有有效的方法可以从drawable文件夹中保存大图像而没有例外?

提前谢谢。

1 个答案:

答案 0 :(得分:3)

如果您只想复制图像文件,则不应该首先将其解码为位图。

您可以使用此复制原始资源文件,例如:

InputStream in = getResources().openRawResource(imageId);
String path = root.getAbsolutePath() + "/Pictures/" + getResources().getString(R.string.app_name) + "/" + timeStamp + ".jpg";
FileOutputStream out = new FileOutputStream(path);
try {
    byte[] b = new byte[4096];
    int len = 0;
    while ((len = in.read(b)) > 0) {
        out.write(b, 0, len);
    }
}
finally {
    in.close();
    out.close();
}

请注意,您必须将图片存储在 res/raw/ 目录中,而不是res/drawable/