#Android 图片模糊 性能总结
模糊一张图片不难,各种算法也很多:高斯、均值、矩阵等等,但是在移动端需要考虑APP的使用体验,对于性能的要求还是很高的。所以在安卓中纯粹使用Java去实现肯定是最坑爹的做法,我们有另外两种方式可以选择:NDK or Renderscript
Renderscript,原则上讲应该是安卓上的最佳选择。它自带了模糊图片的算法,在计算速度上可以说已经非常出色了。但是……
优点:
- 计算速度较快,主要是对CPU的利用比较全面
- 配置工程方便(相对NDK)
- 在不需要自定义算法的情况下使用还是很方便的,只需要写一段java代码就可以完成操作
缺点:
- 学习成本高(如果要自定义一些算法的话)
- 移植代码基本不可能
- 对安卓版本要求较高,比如模糊图片的算法就必须要API17以上
- 自带的模糊算法速度虽快但效果不尽如人意!
Renderscript的模糊用的是什么算法我不清楚,但是出来的效果不太理想!具体效果往后面看,都丁达尔效应了!
NDK在讲求性能的应用中肯定是不能少的,不过我自己用的并不多!所以如果有说的不对请见谅!
优点:
- 用C或C++,肯定很多人都会(感觉又回到在学校A题的时候了)。
- 可应用范围比较广泛, 代码移植方便,有很多现成的库可以拉过来用
- 在进行高复杂度的计算时甩Java好几条街
缺点:
- 我自己写了半天算法完全追不上Renderscript的速度,所以需要有深厚的功力才能很好的发挥它的作用
- Eclipse上配置繁琐,Stusio中稍微简化了点
- 代码调试查错比较麻烦,可能还是跟我的水平有关吧!
我用NDK写了两个算法(一维高斯和均值),然后跟Renderscript自带的模糊做个对比。理论上高斯模糊的效果应是最好的,但是我用了一维高斯叠加的算法所以效果不理想!但是二维高斯又太耗时,递归高斯我又不会!只能这样了 - -
想看代码的点我
- 原图:
- 模糊后的图 右键在链接中打开可以看大图
- 将原图缩小后模糊,然后再放大显示。这样可以节省很多时间。推荐缩放到100像素左右
- 需要渐变效果时可以用两个图层叠加改变透明度的方式。这样多占点内存,但是只需要计算一次
- 我个人感觉最理想的应该还是用NDK来实现,可惜本人C只学了点皮毛,写不好啊啊啊
- 算法很重要!
均值模糊算法:http://blog.ivank.net/fastest-gaussian-blur.html
二维高斯模糊算法:http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html
一维高斯模糊算法:http://www.cnblogs.com/hoodlum1980/p/4528486.html
Android NDK配置:http://blog.csdn.net/tyzlmjj/article/details/50725281
RenderScript 配置和使用:http://blog.csdn.net/tyzlmjj/article/details/50747173