Android中对大图的处理的实现和分析
2011-05-14 23:02
253 查看
在应用中实现图像变换相关的处理时,有时会遇到分配内存失败(OutOfMemoryError)的问题。比如我用N1拍照的分辨率是2500x1900,格式为jpg。使用Bitmap类将打开后,由于是从文件读取,它的属性被设为不能修改(mutable),如果想在大小不变的情况下修改它,只能使用createbitmap建立一个等大的可编辑的bitmap。同时打开两个大文件,就会出现内存不足的提示。使用bitmap类的copy方法,同样会出现这个问题,而使用option设置缩放参数又会影响图像的质量,降低分辨率,不能达到想要的效果。
试了多种方法,有一种非常不好的方法可以实现,就是把图片解码后存入一个临时文件,释放源bitmap,然后用createbitmap建立一个可编辑的空图,再从数据文件中以流的方式读出数据,处理后使用setpixel赋值给bitmap再保存成图片格式,但是这种方法非常慢,无法忍受。
最后的解决方法是使用JNI方法,在C库中分配内存,将图传入库中及对图片进行处理,释放源图,建立可编辑的新图,再从库中读出编辑后的数据,赋值给新图。因为对单个应用内存的限制是在java虚拟机中实现的,所以对C层面并不影响,而且在c库中数据处理,还可以提高处理速度。这样使用简单的函数调用方式就可以实现了,只是需要要实现JNI,并且将so库编进apk,代码上比较麻烦,但效果很不错。
试了多种方法,有一种非常不好的方法可以实现,就是把图片解码后存入一个临时文件,释放源bitmap,然后用createbitmap建立一个可编辑的空图,再从数据文件中以流的方式读出数据,处理后使用setpixel赋值给bitmap再保存成图片格式,但是这种方法非常慢,无法忍受。
最后的解决方法是使用JNI方法,在C库中分配内存,将图传入库中及对图片进行处理,释放源图,建立可编辑的新图,再从库中读出编辑后的数据,赋值给新图。因为对单个应用内存的限制是在java虚拟机中实现的,所以对C层面并不影响,而且在c库中数据处理,还可以提高处理速度。这样使用简单的函数调用方式就可以实现了,只是需要要实现JNI,并且将so库编进apk,代码上比较麻烦,但效果很不错。
相关文章推荐
- Android消息处理机制源码分析(二):本地实现
- Android pthread mutex 实现分析
- Cronet android 设计与实现分析——备选服务机制
- Android仿今日头条和知乎等App顶部滑动导航实现代码分析及源码下载
- Android Handler消息处理顺序分析
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- Android动画之3D翻转效果实现函数分析
- Android按键事件处理分析 .
- Android 热更新实现原理及代码分析
- 如何使用androidpn实现android手机消息推送(简单的源码分析)
- 从源代码分析Android-Universal-Image-Loader的缓存处理机制
- android 4.0 wifi-direct 实现分析-supplicant部分
- Android异步加载全解析之大图处理
- Android 4.4 WebView实现分析
- -写霸-Android 实现字体识别(一)原理分析
- 【Android游戏开发之十】(优化处理)详细剖析Android Traceview效率检视工具,分析程序运行速度!并讲解两种创建SDcard方式!
- Android应用程序消息处理机制(Looper、Handler)分析(转)
- 从源代码分析Android-Universal-Image-Loader的缓存处理机制
- Android视图SurfaceView的实现原理分析
- Androidpn 简单实现及分析