果然前人栽树,后人乘凉.
google搜索”Android实现动态高斯模糊效果”发现2016年转载的博客居多(或者试试英文搜索,可能时间会提前很多.),看来2016年想实现这种效果的产品多; 2014年是图片高斯模糊2015年有性能对比2016年火的就是动态高斯模糊了,不知道对于性能的影响有多大,消耗内存占用资源得有个数据show一下,当然在比较性能之前,应该先实现效果.
待都尝试运行过后再弄数据.
Android实现动态高斯模糊效果 2016-8-5 脚本之家 转载.
这篇使用的是support v8库的RenderScript进行高斯模糊,文中提到的动态高斯模糊改变的不是高斯模糊的radius参数,而是通过FrameLayout ,在下层放一个模糊过的图片,上面该一层原图,通过seekbar动态调整上层原图的alpha值,待上层完全透明后,就露出了下层的模糊过的图片,用户感受的效果是逐渐模糊,实际上是重叠效果,具体看原文.
高斯模糊关键代码:
private Bitmap blur(Bitmap bitmap, float radius) {
Bitmap output = Bitmap.createBitmap(bitmap);
RenderScript rs = RenderScript.create(getActivity());// 构建一个RenderScript对象
ScriptIntrinsicBlur gaussianBlur = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); // 创建高斯模糊脚本
Allocation allIn = Allocation.createFromBitmap(rs, bitmap);//创建用于输入的脚本类型
Allocation allOut = Allocation.createFromBitmap(rs, output); // 创建用于输出的脚本类型
gaussianBlur.setRadius(radius); // 设置模糊半径,范围0f=23则使用rs.releaseAllContexts()
return output;
}
参考:
blurBitmap.java
https://gist.github.com/Mariuxtheone/903c35b4927c0df18cf8
public Bitmap blurBitmap(Bitmap bitmap){
//Let's create an empty bitmap with the same size of the bitmap we want to blur
Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
//Instantiate a new Renderscript
RenderScript rs = RenderScript.create(getApplicationContext());
//Create an Intrinsic Blur Script using the Renderscript
ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
//Create the Allocations (in/out) with the Renderscript and the in/out bitmaps
Allocation allIn = Allocation.createFromBitmap(rs, bitmap);
Allocation allOut = Allocation.createFromBitmap(rs, outBitmap);
//Set the radius of the blur
blurScript.setRadius(25.f);
//Perform the Renderscript
blurScript.setInput(allIn);
blurScript.forEach(allOut);
//Copy the final bitmap created by the out Allocation to the outBitmap
allOut.copyTo(outBitmap);
//recycle the original bitmap
bitmap.recycle();
//After finishing everything, we destroy the Renderscript.
rs.destroy();
return outBitmap;
}
使用RenderScript是有条件的,
* Android SDK Tools 版本必须大于等于22.2
* Android SDK Build-tools 版本必须大于等于18.1.0
这种方法的优势是:
RenderScript这个工具会充分发挥设备的计算能力(CPU和GPU)来进行计算,并且是使用C99衍生语言进行脚本编写的,
* 对于高质量图片或变化较多的需求相较于Java性能是大大的提升。
* 高斯模糊实现 -> 动态高斯模糊实现.
Android 实现毛玻璃效果 来自某个个人博客 blog.hwangjr.com,2015-07-10
利用V 8包提供Render接口实现 部分内容同文献一,并指出文献一方法的弊端:
这种方法直接利用Android系统提供的机制,从代码实现上是最简单也相对高效的实现。在此过程中遇到的很现实的问题是,直接使用ScriptIntrinsicBlur不能得到模糊程度较高的图片:
(1)当模糊半径 (radius)变大后会直接出现计算性能问题。
(2)ScriptIntrinsicBlur脚本模糊半径不能大于25。
考虑到高斯模糊是计算周边像素平均值,在模糊程度很高的情况下,逐点计算平均值从显示效果上优势并不明显。可以通过将图片压缩成小图,计算小图的高斯模糊,再将小图放大的方法来模拟大半径高斯模糊的效果。这里的FastBlur正是很多项目中实际使用的。FastBlur在2014年及更前就已出现。
这种方式通过在Java层中直接实现高斯模糊算法。在大模糊半径和大图片情况下,性能会出现问题。基本目前只作为对低版本Android客户端的兼容性方案使用。
第二个方式通过直接计算高斯并直接在视图画布上实现BlurLinearLayout,用了全局监听不断去截取屏幕截图,再十分之一倍率缩小。
这种方式模糊的是layout本身,不是里面包含的imageview.
其他开源库,还没看。。
kikoso/android-stackblur
OpenGL实现(消耗性能,不推荐)
“ 无论从效果和实时性来讲都是最好的,但需要根据需求来看是否真的有这样的实时性要求。这种方式从显示效果上会优于第一种方法,甚至可以达到渐变的效果,但这些计算都是以耗电作为代价的。作为Launcher这种系统级别的应用,在显示效果差异并不明显的情况下,建议综合考虑耗电量,以及内存和计算性能的消耗。 ”
Android 5.0 下毛玻璃(磨砂)效果如何实现?, 知乎问答,经典总结,2014-12
截取些真心不错的回答:
作者:郑鑫
链接:https://www.zhihu.com/question/27017363/answer/35730275
来源:知乎
著作权归作者所有,转载请联系作者获得授权。这个问题要分两部分来看。
第一是模糊算法,主要目前有两种方案:
(1)借助Renderscript做高斯模糊,这个本质上是做了个卷积计算。
(2)用jni实现StackBlur 算法对图片进行模糊处理,这个可以看下源码,相较于高斯模糊,计算量小了很多。
两种方案都可以进行对Bitmap对象的模糊处理,但当模糊半径增大时,StackBlur能够保持较好的性能,且不受Renderscript半径25px的限制。这两种方案都可以通过对原图进行压缩采样方式优化。至于模糊结果,可以看实际效果,个人认为均可满足需求。
第二是使用场景,同样分为两种:
(1)非实时处理:比如说用做背景虚化,这种场合下对性能要求不是太苛刻,只要保证在非主线程处理好图片,之后填充即可。上面两种方案都可满足需求。
下面是stackblur的一个android实现
kikoso/android-stackblur · GitHub
(2)实时处理:比如说需要在滚动的ListView或者ScrollView上添加毛玻璃遮罩。由于待虚化的Bitmap不是固定不变的,这就需要我们逐帧处理。这个时候半径如果大的话,Renderscript会出现明显的卡顿,而StackBlur方案在中高端机器上会有不错的表现。
下面是一个比较好的开源的android实现,使用起来比较简单
harism/android_anndblur · GitHub
其原理是自定义容器控件,通过重绘的方式获取自身原本要绘制的bitmap纹理,然后实时处理并填充到自身的背景中,能保证基本的流畅度。注意会除了模糊处理,还会引发多余的绘制操作。铁定会拖慢UI的流畅度。
对于实时毛玻璃效果,建议还是多做测试,毕竟耗费计算资源,甚至可以监控fps设置阈值对特效进行开关。
参考链接:
Android:简单靠谱的动态高斯模糊效果
Android 图片模糊 性能总结
android 实时高斯模糊 毛玻璃效果
Android 5.0 下毛玻璃(磨砂)效果如何实现?
segmentfault:
Android高级模糊技术
Android进行高斯模糊的简单实现
使用RenderScript实现高斯模糊(毛玻璃/磨砂)效果