Android 中对大图的处理的实现和分析

#移动开发 #Android

在应用中实现图像变换相关的处理时,有时会遇到分配内存失败 (OutOfMemoryError) 的问题。比如我用 N1 拍照的分辨率是

2500x1900,格式为 jpg。使用 Bitmap 类将打开后,由于是从文件读取,它的属性被设为不能修改 (mutable)

,如果想在大小不变的情况下修改它,只能使用 createbitmap 建立一个等大的可编辑的 bitmap

。同时打开两个大文件,就会出现内存不足的提示。使用 bitmap 类的 copy 方法,同样会出现这个问题,而使用 option

设置缩放参数又会影响图像的质量,降低分辨率,不能达到想要的效果。

试了多种方法,有一种非常不好的方法可以实现,就是把图片解码后存入一个临时文件,释放源 bitmap,然后用 createbitmap

建立一个可编辑的空图,再从数据文件中以流的方式读出数据,处理后使用 setpixel 赋值给 bitmap

再保存成图片格式,但是这种方法非常慢,无法忍受。

最后的解决方法是使用 JNI 方法,在 C

库中分配内存,将图传入库中及对图片进行处理,释放源图,建立可编辑的新图,再从库中读出编辑后的数据,赋值给新图。因为对单个应用内存的限制是在 java

虚拟机中实现的,所以对 C 层面并不影响,而且在 c 库中数据处理,还可以提高处理速度。这样使用简单的函数调用方式就可以实现了,只是需要要实现

JNI,并且将 so 库编进 apk,代码上比较麻烦,但效果很不错。