引言
这件事要从高斯模糊说起——
我们知道IPhone手机上的模糊效果非常的amzing,随着IPhone对该技术的应用,众多android厂商也纷纷效仿。苹果的审美,有一说一,确实领先。而Android中是否也可以实现这一效果呢?又怎么实现呢?
左边小米,右边苹果【均为系统自带模糊】
我们且管这种模糊效果为“毛玻璃效果吧”。我们知道,从ARGB(Alpha,Red,Green,Blue)上来说,简简单单的修改透明度,也只是修改了透明程度,怎么着也不会有近视的效果(也就是毛玻璃效果),它不会模糊。而你想让他糊,那你只能让它混沌,让它模糊。
模糊有很多的算法,平均模糊,高斯模糊...
模糊也有很多的实现方式:
①直接压缩后又放大到原来的尺寸(有损压缩的模糊)、
②使用java直接对Bitmap进行处理,使用平均模糊算法或者高斯模糊的算法、
③使用NDK对Bitmap进行处理,使用平均模糊或高斯模糊算法【其中NDK的实现可以参考这篇文章字节流动的Android NDK 实现图像高斯模糊,他也是搬运的,没有优化的高斯模糊算法实现的,性能很拉】、
④使用FastBlur【使用java实现,算法好像是改进的高斯模糊算法,当我看到里面有三层for循环的时候我就不想看了,速度母鸡,有兴趣的小伙伴可以去学习一下】、
⑤使用AndroidStackBlur【使用NDK实现,也是三层for循环,看不懂,也没多大的兴趣】、
⑥使用OpenGLES实现【可以使用java或NDK开发,但是需要有OpenGL的基础】,可以参考滑板上的老砒霜的博客Android利用OpenGL实现高斯模糊或者它的github【速度很快】
⑦使用RenderScript实现【最简单】【推荐的博客是:知乎的帖子:Android 如何使用 RenderScript ?】
总结一下:
使用java直接写模糊算法最慢、使用NDK直接写次之,因为他们都是使用CPU计算的,所以性能确实不好,而使用GPU进行计算,会快的多,使用RenderScript和OpenGLES是GPU计算的,OpenGLES比RenderScript性能稍好,但RenderScript最简单、先压缩,再模糊,然后还原为原来的尺寸,性能最佳。不过很遗憾的是RenderScript将不再被支持。