Android5.0下毛玻璃(磨砂)效果实现,图片高斯模糊blur

技术调研,可以给一些优缺点的对比.,目前主流实现毛玻璃效果(高斯模糊)分大致三种方法:
  1.利用RenderScript接口
利用现有Android结构,通过RenderScript调用底层接口实现高斯模糊计算.
// Remix Blur
private void blur(Bitmap bkg, View view) {
    …
    RenderScript rs = RenderScript.create(getActivity());
    Allocation overlayAlloc = Allocation.createFromBitmap(rs, overlay);
    ScriptIntrinsicBlur blur = 
        ScriptIntrinsicBlur.create(rs, overlayAlloc.getElement());
    blur.setInput(overlayAlloc);
    blur.setRadius(radius);
    blur.forEach(overlayAlloc);
    overlayAlloc.copyTo(overlay);
    view.setBackground(new BitmapDrawable(getResources(), overlay));
    rs.destroy();
}
说明 :
这种方法直接利用Android系统提供的机制, 从代码实现上是最简单也相对高效的实现. 在此过程中遇到的很现实的问题是: 
 a. 当模糊半径 (radius)变大后会直接出现计算性能问题. 
 b. ScriptIntrinsicBlur脚本模糊半径不能大于25. 因此, 直接使用ScriptIntrinsicBlur不能得到模糊程度较高的图片.

  考虑到高斯模糊是计算周边像素平均值,在模糊程度很高的情况下,逐点计算平均值从显示效果上优势并不明显.可以通过将图片压缩成小图,计算小图的高斯模糊, 再将小图放大的方法来模拟大半径高斯模糊的效果.

2.在低版本Android中通过Java实现高斯模糊
可以参考如下代码实现
https://github.com/paveldudka/blurring/blob/master/app/src/main/java/com/paveldudka/util/FastBlur.java
这种方式通过在Java层中直接实现高斯模糊算法.在大模糊半径和大图片情况下,性能会出现问题.基本目前只作为对低版本Android客户端的兼容性方案使用.

3.通过OpenGL直接实现
    没有具体实践过, 可以参考muzei壁纸的实现, 无论从效果和实时性来讲都是最好的. 但需要根据需求来看是否真的有这样的实时性要求. 这种方式从显示效果上会优于第一种方法,甚至可以达到渐变的效果.但这些计算都是以耗电作为代价的. 作为Launcher这种系统级别的应用, 在显示效果差异并不明显的情况下, 建议 综合考虑耗电量, 以及内存和计算性能的消耗.

-- 其中一个关键技巧是: 先压缩原图大小再高斯. 这样能够大大减少高斯计算量, 提高性能.Android StackBlur 图片模糊效果工具类
 这个问题要分两部分来看:
第一是模糊算法,主要目前有两种方案:
 (1)借助Renderscript做高斯模糊,这个本质上是做了个卷积计算。
 (2)用jni实现StackBlur 算法对图片进行模糊处理,这个可以看下源码,相较于高斯模糊,计算量小了很多。
 两种方案都可以进行对Bitmap对象的模糊处理,但当模糊半径增大时,StackBlur能够保持较好的性能,且不受Renderscript半径25px的限制。这两种方案都可以通过对原图进行压缩采样方式优化。至于模糊结果,可以看实际效果,个人认为均可满足需求。

第二是使用场景,同样分为两种:
 (1)非实时处理:比如说用做背景虚化,这种场合下对性能要求不是太苛刻,只要保证在非主线程处理好图片,之后填充即可。上面两种方案都可满足需求。
下面是stackblur的一个android实现- https://github.com/kikoso/android-stackblur
 (2)实时处理:比如说需要在滚动的ListView或者ScrollView上添加毛玻璃遮罩。由于待虚化的Bitmap不是固定不变的,这就需要我们逐帧处理。这个时候半径如果大的话,Renderscript会出现明显的卡顿,而StackBlur方案在中高端机器上会有不错的表现。一个比较好的开源的android实现- https://github.com/harism/android_anndblur
  其原理是自定义容器控件,通过重绘的方式获取自身原本要绘制的bitmap纹理,然后实时处理并填充到自身的背景中,能保证基本的流畅度。注意会除了模糊处理,还会引发多余的绘制操作。铁定会拖慢UI的流畅度。
  对于实时毛玻璃效果,建议还是多做测试,毕竟耗费计算资源,甚至可以监控fps设置阈值对特效进行开关。
  给一个图片,质量压缩到很小,然后方大,然后对这个图片进行blur,blur网上有很多方法,都可以用。压缩到很小后,放大然后blur,速度非常快。 
-- 高斯模糊- https://github.com/woshidasusu/base-module/tree/master/blur
Android 的高斯模糊组件- https://github.com/kikoso/android-stackblur
高斯模糊- https://github.com/Blankj/AndroidUtilCode
Google 官方提供的 RenderScript 方式 (RSBlur)
C 编写的高斯算法 blur.c 方式 (NativeBlur)
Java 编写的高斯算法方式1(JavaBlur)
Java 编写的高斯算法方式2(StackBlur)

> 毛玻璃效果
强大的毛玻璃特效开源库- https://mp.weixin.qq.com/s?__biz=MzIwMTAzMTMxMg==&mid=2649493879&idx=1&sn=4314859f685d7836e561fd231313544d&chksm=8eec9a88b99b139e01f7d00b480986ee0509b9145ca628ecbf0faca049ca5314b341d78e78eb&scene=21#wechat_redirect
  毛玻璃效果实际上是对原图片的严重劣化,突出朦胧感,一般都是通过图片的缩放+模糊算法来实现,从性能角度考虑,模糊半径不能大于25,所以要更高的模糊效果则需要进行缩放。
 1.Java实现,一般都是采用Stack模糊算法
 2.RenderScript实现
 3.Native实现
 4.OpenCV或者OpenGL实现,由于其复杂度

 Java代码实现毛玻璃效果基本上都是采用的Stack模糊算法,该算法比高斯模糊及均值模糊算法更高效,效果更好。
 RenderScript是一个在Android上以高性能运行计算密集型任务的框架。它对执行图像处理,计算摄影或计算机视觉的应用程序尤其有用。RenderScript提供了一个实现高斯模糊的类ScriptIntrinsicBlur. 由于RenderScript的最低支持版本是11,但很多方法都是在17及以后添加的,所以使用RenderScript的最低版本应该为17。但如果要向下兼容则需要使用谷歌提供的向下兼容库android.support.v8.renderscript。由于该库会明显增加APK大小,所以慎重使用。

- 通过RenderScript或者RenderScript+Java来实现毛玻璃效果的
Blurry(https://github.com/wasabeef/Blurry)是GitHub一个比较热门的毛玻璃效果实现库。
  可以发现Blurry仅支持在本地图片上实现毛玻璃效果,那么如何对网络图片实现毛玻璃效果尼?可以参考glide-transformations、picasso-transformations、fresco-processors这三个库的实现,由于它们与Blurry的作者是同一人,所以它们的实现原理与Blurry一样。但有一点需要注意,glide-transformations有使用RenderScript的向下兼容库,所以会明显增加APK大小。

blurkit-android(https://github.com/CameraKit/blurkit-android)也是GitHub上比较热门的毛玻璃效果实现库。

- 通过NDK或者OpenGL来实现毛玻璃效果的开源项目
android-stackblur(https://github.com/kikoso/android-stackblur)
HokoBlur(https://github.com/HokoFly/HokoBlur)

  如果对Bitmap或者View进行模糊处理则优先使用Blurry;
  如果要遮罩效果,则优先使用blurkit-android,虽然它有点小坑,但完全可以自己解决;
  如果要对网络图片进行模糊处理,可以参考glide-transformations、picasso-transformations、fresco-processors这三个项目,但不建议直接导入,毕竟仅为一个毛玻璃效果而导入整个库,有点不划算。
  如果想要自己来实现毛玻璃效果,可以参考android-stackblur及HokoBlur这两个项目

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值