Android BitmapFactory decodeResource 内存不足异常
Android BitmapFactory decodeResource Out of Memory Exception
我是 android 的新手,正在开发一款应用程序,可将可绘制文件夹中的大图像保存到 phone 存储空间。这些文件的分辨率为 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"
.
不是一个好习惯
有没有什么有效的方法可以毫无例外地从可绘制文件夹中保存大图像?
提前致谢。
如果你只是想复制图像文件,你不应该首先将它解码成位图。
你可以复制原始资源文件,例如:
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/
.
我是 android 的新手,正在开发一款应用程序,可将可绘制文件夹中的大图像保存到 phone 存储空间。这些文件的分辨率为 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"
.
有没有什么有效的方法可以毫无例外地从可绘制文件夹中保存大图像?
提前致谢。
如果你只是想复制图像文件,你不应该首先将它解码成位图。
你可以复制原始资源文件,例如:
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/
.