图片模糊算法

有很多App对背景进行高斯图模糊设计,比如网易云音乐、QQ、微信、随手记等等。在Adnroid中,现在常用的图片高斯模糊技术有三种:RenderScript 、fastBlur、对RenderScript和fastBlur的优化,下面分析这三种方法的优缺点,先贴图。
图片模糊算法_第1张图片 图片模糊算法_第2张图片

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系统以下已经非常少见了
图片模糊算法_第3张图片

fastBlur

fastBlur是Java原生开发的,经过每个像素点进行高斯模糊计算,最后合成Bitmap

优点:
  • 不用引入三方包,不会增加APK大小
  • 没有兼容版本问题
缺点:
  • 效率很低,在Java层做处理
  • 将Bitmap全部加载到内存,较大图片容易OOM

RenderScript和fastBlur的优化

方法:先对bitmap进行缩小,使其丢失一些像素点,接着进行模糊化处理,然后再放大到原来尺寸。因为图片缩小后再进行模糊处理,需要处理的像素点和半径都变小,所以模糊处理速度加快。
例如RenderScript优化后的代码
图片模糊算法_第4张图片

两种算法优化结果对比过程:通过模糊处理不同大小的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

柱状图对比:
图片模糊算法_第5张图片
(模糊4.27MB的bitmap)
图片模糊算法_第6张图片
(模糊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使用率以及不需要引用兼容包;

参考链接

  1. https://www.jianshu.com/p/54df911512f4?utm_campaign=hugo&utm_medium=reader_share&utm_content=note&utm_source=qq
  2. https://github.com/wasabeef/Blurry
  3. https://github.com/kikoso/android-stackblur
  4. https://github.com/Dimezis/BlurView

你可能感兴趣的:(Android)