加载和裁剪位图而不会出现Out Of Memory异常

时间:2016-04-03 20:44:56

标签: android image

我需要从Facebook,Instagram或设备本身裁剪图像。在用户流程结束时(他选择它们),所有所述图像应该发送到服务器。但是所有宽度/高度比都相同(例如3/2),因此我需要手动裁剪图像。

这是一个简单的示例,说明我的上传服务和裁剪中发生了什么:

Bitmap bitmap = ImageLoading.getLoader(UploadService.this).loadImageSync(path);
//crop calculations
Bitmap croppedBitmap = Bitmap.createBitmap(bitmap, x, y, w, y);
String croppedPath = saveCroppedImage(croppedBitmap);

然后我从文件系统中读取此文件并将其编码为BASE64以将其发送到后端。

当我必须为多个图像执行此操作时,我经常会遇到OOM异常。也许我会以错误的方式去做..在服务器端裁剪真的是我想要做的最后一件事,因为后端必须查询Facebook或Instagram。

加载位图的缩放版本不是一个选项,我不会在设备上显示它。

我试过了:

  • System.gc()的
  • Bitmap.recycle();
  • 我应该在清单中真正使用largeHeap吗?

注意:我也在使用Universal Image Loader进行用户流程,这也是我在上传服务中使用它的原因。

1 个答案:

答案 0 :(得分:0)

我认为你应该在AndroidManifest文件中添加largeHeap = true。

其次,如果您使用的是Universal ImageLoader,则可以下载较小尺寸的位图。请看一下这段代码:

ImageSize targetSize = new ImageSize(80, 50); // result Bitmap will be fit to this size
Bitmap bmp = imageLoader.loadImageSync(imageUri, targetSize, options); // This bitmap will be of specified size.

您可以点击链接进一步了解Universal Image Loader