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

    在应用中实现图像变换相关的处理时,有时会遇到分配内存失败(OutOfMemoryError)的问题。比如我用N1拍照的分辨率是2500x1900,格式为jpg。使用Bitmap类将打开后,由于是从文件读取,它的属性被设为不能修改(mutable),如果想在大小不变的情况下修改它,只能使用createbitmap建立一个等大的可编辑的bitmap。同时打开两个大文件,就会出现内存不足的提示。使用bitmap类的copy方法,同样会出现这个问题,而使用option设置缩放参数又会影响图像的质量,降低分辨率,不能达到想要的效果。

试了多种方法,有一种非常不好的方法可以实现,就是把图片解码后存入一个临时文件,释放源bitmap,然后用createbitmap建立一个可编辑的空图,再从数据文件中以流的方式读出数据,处理后使用setpixel赋值给bitmap再保存成图片格式,但是这种方法非常慢,无法忍受。

最后的解决方法是使用JNI方法,在C库中分配内存,将图传入库中及对图片进行处理,释放源图,建立可编辑的新图,再从库中读出编辑后的数据,赋值给新图。因为对单个应用内存的限制是在java虚拟机中实现的,所以对C层面并不影响,而且在c库中数据处理,还可以提高处理速度。这样使用简单的函数调用方式就可以实现了,只是需要要实现JNI,并且将so库编进apk,代码上比较麻烦,但效果很不错。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值