在应用中实现图像变换相关的处理时,有时会遇到分配内存失败(OutOfMemoryError)的问题。比如我用N1拍照的分辨率是2500x1900,格式为jpg。使用Bitmap类将打开后,由于是从文件读取,它的属性被设为不能修改(mutable),如果想在大小不变的情况下修改它,只能使用createbitmap建立一个等大的可编辑的bitmap。同时打开两个大文件,就会出现内存不足的提示。使用bitmap类的copy方法,同样会出现这个问题,而使用option设置缩放参数又会影响图像的质量,降低分辨率,不能达到想要的效果。
试了多种方法,有一种非常不好的方法可以实现,就是把图片解码后存入一个临时文件,释放源bitmap,然后用createbitmap建立一个可编辑的空图,再从数据文件中以流的方式读出数据,处理后使用setpixel赋值给bitmap再保存成图片格式,但是这种方法非常慢,无法忍受。
最后的解决方法是使用JNI方法,在C库中分配内存,将图传入库中及对图片进行处理,释放源图,建立可编辑的新图,再从库中读出编辑后的数据,赋值给新图。因为对单个应用内存的限制是在java虚拟机中实现的,所以对C层面并不影响,而且在c库中数据处理,还可以提高处理速度。这样使用简单的函数调用方式就可以实现了,只是需要要实现JNI,并且将so库编进apk,代码上比较麻烦,但效果很不错。