裁剪图像而不加载到内存中

时间:2013-04-25 19:22:23

标签: android

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

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

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

任何人都可以指导我如何实现这一目标吗?

2 个答案:

答案 0 :(得分:3)

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

如果你不能使用它:

许多图像格式都是压缩的,因此需要加载到内存中。

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

更简单的任务就是在JNI中完成所有操作,这样即使你会使用大量内存,至少你的应用程序也不会很快进入OOM,因为它不会被限制在最大值普通应用程序强加的堆大小。

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

答案 1 :(得分:0)

我非常怀疑您可以使用现有的Android API解决此问题。

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

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