有很多App对背景进行高斯图模糊设计,比如网易云音乐、QQ、微信、随手记等等。在Adnroid中,现在常用的图片高斯模糊技术有三种:RenderScript 、fastBlur、对RenderScript和fastBlur的优化,下面分析这三种方法的优缺点,先贴图。
RenderScript
RenderScript是在Android上的高性能运行密集型运算的框架,主要用于数据并行计算,尤其对图像处理、摄影分析和计算机视觉特别有用。基于c/c++开发的库,提供Java层调用API,快速、不丢帧处理高斯图模糊,RenderScript是在Android3.0(API 11)引入的
优点:
- 使用简单,原生的API,十行左右的代码就能完成高斯模糊
- 效率较高,是在c/c++层做处理
缺点:
- API 17以上才能使用,低于该版本需要使用兼容包,会导致APK体积增大,support包约160k
兼容包:android.support.v8.renderscript,能兼容到Android 2.3版本(API 9),看下图在app bulid.gradle引入,代码跟API 17以上的一样,注意市场上Android 4.4系统以下已经非常少见了
fastBlur
fastBlur是Java原生开发的,经过每个像素点进行高斯模糊计算,最后合成Bitmap
优点:
- 不用引入三方包,不会增加APK大小
- 没有兼容版本问题
缺点:
- 效率很低,在Java层做处理
- 将Bitmap全部加载到内存,较大图片容易OOM
RenderScript和fastBlur的优化
方法:先对bitmap进行缩小,使其丢失一些像素点,接着进行模糊化处理,然后再放大到原来尺寸。因为图片缩小后再进行模糊处理,需要处理的像素点和半径都变小,所以模糊处理速度加快。
例如RenderScript优化后的代码
两种算法优化结果对比过程:通过模糊处理不同大小的bitmap,记录同一bitmap使用两种算法系统内存使用量、CPU使用率、循环50次平均模糊时间,其中选取的图片格式包括jpeg、jpg和png
RenderScript:
Bitmap 大小(MB) | 处理后图片大小(MB) | 内存使用(MB) | CPU使用(%) | 50次平均模糊时间(ms) |
---|---|---|---|---|
6.35 | 8.11 | 244 | 64.7 | 124 |
4.27 | 5.46 | 164 | 59.8 | 92 |
0.81 | 1.04 | 84 | 47 | 25 |
0.74 | 0.94 | 77.1 | 36.8 | 23 |
fastBlur:
Bitmap 大小(MB) | 处理后图片大小(MB) | 内存使用(MB) | CPU使用(%) | 50次平均模糊时间(ms) |
---|---|---|---|---|
6.35 | 8.11 | 219.2 | 16 | 4637 |
4.27 | 5.46 | 178 | 16.2 | 3360 |
0.81 | 1.04 | 120 | 17.8 | 481 |
0.74 | 0.94 | 106 | 16.3 | 461 |
柱状图对比:
(模糊4.27MB的bitmap)
(模糊0.81MB的bitmap)
结论
RenderScipt和fastBlur对比,在内存使用量方面差别不大,但是RenderScipt算法CPU使用率较高,模糊时间比较快速,比fastBlur快10倍以上,其中图片格式分别为jpeg、jpg和png的效果几乎一样
建议
使用RenderScipt,可以加快模糊速度,但是当API<=17(4.2系统)使用RenderScipt需要引用(160kb)的包,4.2以上则不需要引包;API<=17使用fastBlur,可以降低CPU使用率以及不需要引用兼容包;