调用 createBitmap 时出现内存不足错误 [重复]

Posted

技术标签:

【中文标题】调用 createBitmap 时出现内存不足错误 [重复]【英文标题】:Out of memory error when calling createBitmap [duplicate] 【发布时间】:2014-08-14 04:43:12 【问题描述】:

我试图解决android Camera Intent Saving Image Landscape When Taken Portrait 的问题,但遇到了dalvikvm-heap Out of memory on a 63489040-byte allocation. 错误的问题。我查看了createBitmap() leads me into a java.lang.OutOfMemoryError,但这个问题没有任何帮助。我不知道如何解决这个问题。我尝试在位图上调用recycle(),但没有成功。

String file = getRealPathFromURI(Uri.parse(mUriString));
BitmapFactory.Options bounds = new BitmapFactory.Options();
bounds.inJustDecodeBounds = true;
BitmapFactory.decodeFile(file, bounds);

BitmapFactory.Options opts = new BitmapFactory.Options();
Bitmap bm = BitmapFactory.decodeFile(file, opts);
ExifInterface exif = new ExifInterface(file);
String orientString = exif.getAttribute(ExifInterface.TAG_ORIENTATION);
int orientation = orientString != null ? Integer.parseInt(orientString) : ExifInterface.ORIENTATION_NORMAL;
int rotationAngle = 0;

switch(orientation) 
case ExifInterface.ORIENTATION_ROTATE_90:
    rotationAngle = 90;
case ExifInterface.ORIENTATION_ROTATE_180:
    rotationAngle = 180;
case ExifInterface.ORIENTATION_ROTATE_270:
    rotationAngle = 270;


Matrix matrix = new Matrix();
matrix.setRotate(rotationAngle, (float) bm.getWidth() / 2, (float) bm.getHeight() / 2);
Bitmap rotatedBitmap = Bitmap.createBitmap(bm, 0, 0, bounds.outWidth, bounds.outHeight, matrix, true);
bm.recycle();

此代码读取 EXIF 数据并正确定位图像。

我还应该补充一点,我正在这里压缩图像:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] imageBytes = baos.toByteArray();
rotatedBitmap.recycle();
baos.close();

【问题讨论】:

【参考方案1】:

当您解码BitmapFactory.Options 中的图像时,您可以通过跳过ARGB_8888 并改用RGB_565 来减少内存。和 inDither 为 true 以保持图像质量。

样本:

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = false;
opts.inPreferredConfig = Config.RGB_565;
opts.inDither = true;

【讨论】:

有什么办法可以破坏图像压缩? @lschessinger 你怎么能说它会破坏压缩? 没关系。不相关的问题(我认为)。【参考方案2】:

您可以使用opts.inSampleSize = 2 or above 来避免OOM 异常。

【讨论】:

以上是关于调用 createBitmap 时出现内存不足错误 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 VisualVm 分析堆转储时出现内存不足错误

处理大型数据集时出现内存不足错误

使用 Numba 进行矩阵乘法时出现 CUDA 内存不足错误

在 ListView 中使用 LazyList 时出现内存不足错误 [重复]

读取块中的csv文件时出现内存不足错误

发送连续网络摄像头图像时出现内存不足错误java