4

我想裁剪大尺寸的图像并尝试使用 Bitmap.createBitmap 但它给出了 OOM 错误。此外,围绕 createBitmap 尝试了多种技术,但都没有成功。

现在我考虑将图像保存到文件系统并裁剪它而不将图像加载到可能解决问题的内存中。但不知道该怎么做。

用户流程:每个快照用户可以手动裁剪后,用户将从应用内相机拍摄多张照片,或者应用程序将在某些预定义的登录时静默裁剪,然后将这些图像发送到服务器。

谁能指导我如何实现这一目标?

4

2 回答 2

3

有一个名为BitmapRegionDecoder的类可能会对您有所帮助,但它可从 API 10 及更高版本获得。

如果你不能使用它:

许多图像格式都经过压缩,因此需要某种形式的加载到内存中。

您需要阅读适合您需要的最佳图像格式,然后自己阅读,仅使用您需要的内存。

一个更简单的任务是在 JNI 中完成这一切,这样即使您将使用大量内存,至少您的应用程序不会这么快进入 OOM,因为它不会被限制为最大堆大小强加于普通应用程序。

当然,由于 android 是开源的,您可以尝试使用 BitmapRegionDecoder 并将其用于任何设备。

于 2013-04-25T22:16:10.733 回答
0

我非常怀疑你可以用现有的 Android API 解决这个问题。

您需要做的是获取可用的图像访问库之一(libpng 可能是您最好的选择)并通过 jni 将其链接到您的应用程序(查看是否已有可用的 Java 绑定)。

使用低级 I/O 操作一次读取一条扫描线的图像。丢弃垂直裁剪区域之前或之后的任何扫描线。对于垂直裁剪区域内的那些扫描线,只取水平裁剪区域内的那些像素并将它们写入裁剪图像。

于 2013-04-25T22:10:54.377 回答