gpt4 book ai didi

java - 尝试压缩位图时出现 OutOfMemoryError

转载 作者:行者123 更新时间:2023-11-30 02:47:28 25 4
gpt4 key购买 nike

我正在使用 android-crop图书馆。如果用户尝试从大图像(来自手机摄像头的图像)裁剪,我正在处理令人沮丧的内存不足异常。

我已尝试压缩生成的位图,但在尝试压缩位图时仍然出现 OutOfMemoryError。这是我的代码:请让我知道我做错了什么和/或如何防止这种内存不足错误?

private void handleCrop(int resultCode, Intent result) {
if (resultCode == RESULT_OK) {

if (mBitmap != null) {
mBitmap.recycle();
mBitmap = null;
}

Bitmap temp; //temporary bitmap

try {
temp = MediaStore.Images.Media.getBitmap(getContentResolver()
, Crop.getOutput(result)); //load image from URI

ByteArrayOutputStream out = new ByteArrayOutputStream();
temp.compress(Bitmap.CompressFormat.JPEG, 60, out);
mBitmap = BitmapFactory.decodeStream(new ByteArrayInputStream(out.toByteArray()));

out.close();
temp.recycle();
temp = null;
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "error loading photo. please try with another photo"
, Toast.LENGTH_SHORT).show();
return;
}

if (mBitmap != null) {
mImageViewProfilePhoto.setImageBitmap(mBitmap);
enableFinalization();
}

}
}

感谢 Gabe 的观点,我可以像这样解决问题:

private void handleCrop(int resultCode, Intent result) {
if (resultCode == RESULT_OK) {

if (mBitmap != null) {
mBitmap.recycle();
mBitmap = null;
}

try {
mBitmap = MediaStore.Images.Media.getBitmap(getContentResolver()
, Crop.getOutput(result)); //load image from URI

File tempImageFile = new File(mContext.getFilesDir().getAbsolutePath()
, "temp_1311_14_hahahah_lol_WTF_shit_1414.bin");

FileOutputStream out = new FileOutputStream (tempImageFile);
mBitmap.compress(Bitmap.CompressFormat.JPEG, 30, out);
mBitmap.recycle();
mBitmap = null;

mBitmap = BitmapFactory.decodeFile(tempImageFile.getPath());
boolean deleted = tempImageFile.delete();
out.close();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "error loading photo. please try with another photo"
, Toast.LENGTH_SHORT).show();
return;
}

if (mBitmap != null) {
mImageViewProfilePhoto.setImageBitmap(mBitmap);
enableFinalization();
}

} else if (resultCode == Crop.RESULT_ERROR) {
Toast.makeText(this, Crop.getError(result).getMessage(), Toast.LENGTH_SHORT).show();
disableFinalization();
}
}

希望对其他人有用。

最佳答案

假设问题不在您的应用程序的其他地方(并且它总是可能与 OOM 相关)- 如果您有一个大图像,您基本上是在制作它的 3 个副本。第一个是原始的,第二个在您的 ByteArrayOutputStream 中,第三个在您的 decodeStream 中。如果图像很大(如 10MB 以上),这本身就会导致问题。我建议使用基于磁盘的输出流,看看是否能解决问题。此外,您可以将 decodeStream 调用放在 temp.recycle 之后,以确保您不会一次拥有 2 个完整副本。

关于java - 尝试压缩位图时出现 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24791101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com