高斯模糊能够很好的增加图片的美感,在实际开发中使用的比较多,这里提供了三种方式实现这种效果。
RenderScript实现
RenderScript是Android3.0中引入的,用来在Android上编写高性能代码的一种语言(使用C99标准)。
实现高斯模糊的核心代码:
|
|
当ImageView开始加载背景图时,取出它的drawableCache,进行blur处理,Gaussian blur的主要逻辑在blur函数中。对于在Java中使用RenderScript,文档中也有详细描述,对应到我们的代码,步骤为:
- 初始化一个RenderScript Context.
- 至少创建一个Allocation对象用于存储需要处理的数据.
- 创建compute kernel的实例,本例中是内置的ScriptIntrinsicBlur对象.
- 设置ScriptIntrinsicBlur实例的相关属性,包括Allocation, radius等.
- 开始blur操作,对应(forEach).
- 将blur后的结果拷贝回bitmap中。
使用RenderScript存在兼容性的问题,但是性能是非常高的,在API-17以下使用需要导入RenderScript-v8兼容包,暂还试过低版本的兼容,有兴趣的可以谷歌一下。
FastBlur实现
FastBlur实现的核心代码如下:
blur方法:
applyBlur方法:
AdvancedFastBlur实现
AdvancedFastBlur同样是使用FastBlur实现的,原理为先通过缩小图片,使其丢失一些像素点,接着进行模糊化处理,然后再放大到原来尺寸。由于图片缩小后再进行模糊处理,需要处理的像素点和半径都变小,从而使得模糊处理速度加快。代码如下:
applyBlur方法和FastBlur对象与FastBlur实现中的相同。效率要高于FastBlur。
注意
由于FastBlur是将整个bitmap拷贝到一个临时的buffer中进行像素点操作,因此,它不适合处理一些过大的背景图,会容易导致OOM。