【发布时间】:2016-04-01 12:21:35
【问题描述】:
我想裁剪图像而不收到OutOfMemory 异常。
这意味着我有裁剪图像的 x、y、宽度和高度,并且想要裁剪原始图像而不将其带入内存。
是的,我知道BitmapRegionDecoder 是个好主意,但裁剪后的图像可能太大而无法记忆。
编辑:我想 保存 裁剪的图像,而不仅仅是在
ImageView 中显示它
我想将它保存在一个新文件中不丢失尺寸
在这种情况下,裁剪后的图像分辨率为 20000x20000,下面的代码将无法正常工作,导致 OOM:
BitmapRegionDecoder bitmapRegionDecoder = BitmapRegionDecoder.newInstance(inputStream, false);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bitmap = bitmapRegionDecoder.decodeRegion(new Rect(width / 2 - 100, height / 2 - 100, width / 2 + 100, height / 2 + 100), options);
mImageView.setImageBitmap(bitmap);
使用 inSampleSize 减小原始图片大小很好,但我保存的结果不再是 20000x20000。
如何裁剪 25000x25000 并将图像的 20000x20000 部分保存在文件中?
【问题讨论】:
-
为什么要投反对票?分享你的知识
-
Stack Overflow 用于编程问题。你的问题是什么?如果您的问题是“我该怎么做?”,请说明您尝试过的方法以及遇到的具体问题。
-
是的!我的问题是我如何在android中做到这一点?我已经在 StackOverflow 中尝试了有关相关问题的所有答案,每个答案都取决于
Bitmap对象,这是 OOM 的风险。我不知道我的问题的哪一部分含糊不清@CommonsWare -
你能过去一些代码吗?您是否使用 backtask 来执行此操作?你用的是什么设备?
-
我认为根据需要调整大图像的大小真的很棘手。请注意,android 是用于内存有限的小型设备的系统。即使您将使用 RGB_565,25000x25000 图像的大小在 RAM 中也将超过 1.1GB。因此,我所能建议的只是尝试查看一些流 Java 库,这些库可能会调整图像的大小,而无需“即时”将其加载到内存中。或者尝试查看 NDK、RenderScript 或 OpenGL。