高斯模糊滤镜效果解析

前言

这个东西呢不管看起来,听起来都很高大上哈.鄙人比较懒,知道有这么个东西,却一直没去研究.感叹技术日新月异,有时候觉得自己掉队好远了.这不项目中便遇到了使用这家伙的情况.这次需要做一个音乐类app,需要有毛玻璃的高大上效果.这个效果在众多音乐app中非常常见,也确实非常漂亮.但在网页端见得比较少.大概是兼容性和性能问题吧(强烈吐槽性能).也没办法,有需求就得想办法去实现是不是,不过最讨厌跟那群UE,PM撕逼.如果对她们说这个东西很麻烦,不好实现.然后她们一副哥哥你一定可以的!!花痴表情强行绑架了我.哎,谁让我是程序员呢. 其实吧我自己也挺想去实现这个东西的。默默的给自己打了一针鸡血便投入无尽的搜寻,学习中.

css3-filter

搜索一番,找到这个属性filter:blur(5px)。赶快去实现一把。

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta http-equiv="content-type" content="text/html; charset=utf-8">
 5 <title></title>
 6 <style>
 7 .d1{
 8     background-image:url(‘./lp.png‘);
 9     background-size:cover;
10     -webkit-filter:blur(10px);
11     filter:blur(10px);
12     width:300px;
13     height:300px;
14 }
15 </style>
16 </head>
17 <body>
18
19     <div class="d1"></div>
20 </body>
21 </html>

咳咳, 献上一个萌妹子.实在找不到图片了.O(∩_∩)O哈哈~

blur的效果就是虚化图片.值越大虚化得越厉害.

瞬间高大上了有木有!!

....

....

....

然而事情并没有这么简单.滤镜算法是对图片的像素点做处理,也就是说你需要设置一张背景图.当前元素设置滤镜属性后,元素里面的内容也会被影响.就拿上面的例子来说,如果元素里面有文字的话,那么文字也看不见了.聪明的你肯定会想到再叠一层不就完了嘛.事实情况也确实如此(这不是废话么...)让我们来看下

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title></title>
<style>

.wrap{
    position:relative;
    width:300px;
    height:300px;
    line-height:300px;
    text-align:center;
}
.d1{
    background-image:url(‘./lp.png‘);
    background-size:cover;
    -webkit-filter:blur(10px);
    filter:blur(10px);
    position: absolute;
    top:0;
    left:0;
    width:100%;
    height:100%;
    z-index:-1;
}

</style>
</head>
<body>

    <div class="wrap">
        <div class="d1"></div>
        <div class="content">我爱你老婆</div>
    </div>
</body>
</html>

完美!

.....

.....

.....

然而事情并没有这么简单!

歌词多是用白色字体,毛玻璃还是太亮了,容易混淆. 嘿嘿,其实也简单,再加上一点背景透明度就好啦.

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title></title>
<style>

.wrap{
    position:relative;
    width:300px;
    height:300px;
}
.d1{
    background-image:url(‘./lp.png‘);
    background-size:cover;
    -webkit-filter:blur(10px);
    filter:blur(10px);
    position: absolute;
    top:0;
    left:0;
    width:100%;
    height:100%;
    z-index:-1;
}

.content{
    width:100%;
    height:100%;
    line-height:300px;
    color:#fff;
    text-align:center;
    background-color:rgba(0,0,0,0.3);
}

</style>
</head>
<body>

    <div class="wrap">
        <div class="d1"></div>
        <div class="content">我爱你老婆</div>
    </div>
</body>
</html>

看这下是不是好多啦. 恩比较有玻璃质感了.其实吧,还有个坑爹的问题, 加了滤镜blur的元素就变成透明的了,虽然有背景图也还是透明的.所以在需要毛玻璃覆盖底层的情况下,得再叠一层,添加一个背景色.

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title></title>
<style>

.wrap{
    position:relative;
    width:300px;
    height:300px;
}
.filter{
    background-image:url(‘./lp.png‘);
    background-size:cover;
    -webkit-filter:blur(10px);
    filter:blur(10px);
    position: absolute;
    top:0;
    left:0;
    width:100%;
    height:100%;
    z-index:-1;
}
.filter-bg{
    position:absolute;
    top:0;
    left:0;
    width:100%;
    height:100%;
    background-color:#333;
    z-index:-2;
}

.content{
    width:100%;
    height:100%;
    line-height:300px;
    color:#fff;
    text-align:center;
    background-color:rgba(0,0,0,0.3);
}

</style>
</head>
<body>

    <div class="wrap">
        <div class="filter-bg"></div>
        <div class="filter"></div>
        <div class="content">我爱你老婆</div>
    </div>
</body>
</html>

咱们可以隐约的发现,在图片的四周模糊效果不是很好,这种情况在blur的值越大的时候越明显,趋势是模糊区域向图像中颜色明显的地方靠近,边缘地方就显得透明,甚至貌似没有模糊.建议blur的值设置在30以下.

似乎问题就这么解决了!!

真的解决了?!

真的?

svg-<filter>

我兴奋的,天真的以为事情就这么完了,然而当我附上动画后,让毛玻璃动起来时,整个人都崩溃了. fuck! 哥才买的6s玫瑰金,卡得跟屎一样.当然补充下前提条件,是在播放音乐的时候拖动页面,页面元素数量一般.但不至于播放个音乐拖垮了整个页面性能吧.二愣子的我拖着电脑就去找pm了,你看,就是你要做这种效果,卡得跟方便面一样一条一条的.搞不定,砍需求!

pm碍于我愤怒的表情,打起了太极.你先冷静冷静.什么事儿都好商量.你要不喝点儿饮料?

我当然接受了(你们不要用异样的眼光看着我).  喝着饮料平静了下心情,这事儿吧总得解决.和pm鬼扯了半天还是觉得要保留这个效果,不然做了那么久就白费了.况且一个好的工程师(注意我没有用程序员!)就得迎难而上啊,创造力和解决问题的能力才是工程师们的价值所在.首先还是得定位问题,为了确定是filter属性的锅,我把滤镜层给删掉,卧槽丝滑般流畅.看来这属性真是性能堪忧啊.那怎么办呢,我最终还是抱向了google的大腿.一番搜索,果然不负众望.原来除了css3之外,svg和canvas也是可以实现滤镜效果的.我试了下svg,效果真是好得出奇.很流畅.将我们刚才的filter层替换为svg实现

<svg version="1.1"
     xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink"
     xmlns:ev="http://www.w3.org/2001/xml-events"
     baseProfile="full">
    <defs>
        <filter id="blur">
            <feGaussianBlur stdDeviation="10" />
        </filter>
    </defs>
    <image xlink:href="./mm.jpg" x="0" y="0" height="200" width="200" filter="url(#blur)"/>
</svg>

<filter>标签用来描述滤镜,其id属性唯一标识一个滤镜.<filter>标签必须写在<defs>标签内.<defs>标签是对特殊效果进行描述.

最终效果不卡.我猜测应该是实现机制不同,svg添加上滤镜后就会把它当成一个图片来处理,不会重复消耗cpu计算.而css3的filter属性应该是在滚动的时候会动态计算,在做一些比较复杂的效果时候,卡顿就很明显.

使用svg的滤镜依然会使得svg层变得透明,在不希望透明的时候记得添加一层背景色.

兼容性对比

咱们再来对比一下兼容性,可见svg稍好,在安卓上都是4.4才支持.

两种方式的其他滤镜方法没用过,似乎也不太常用,也不多说了,网上都能查到.

总结

  • css3滤镜方便,性能不好,适合做静止的简单效果
  • svg滤镜性能好,适合做多层运动
  • css3滤镜需要添加背景图,svg滤镜背景可以是画出来的
  • css3和svg的高斯模糊滤镜都会使得该层变得透明
  • 高斯模糊在图片的边缘效果不太好,可以放大图片width=105%
  • 兼容性二者差不多,svg稍好

参考资料:

时间: 2024-10-29 19:06:45

高斯模糊滤镜效果解析的相关文章

web音乐播放器总结

前言 项目暂时告一段落,胸中有股炽热之气望喷涌而出!忍不住吐槽,为什么程序员要加班啊,为什么产品下达deadline,就得把这生死剑架在程序员的脖子上.卧槽,听说程序员在国外是叫工程师的.最近看了很多乱七八糟的文章,有人说真正牛逼的人从不加班,不聪明却勤奋的人是公司加班文化的始作俑者.这种人就该从公司中被排除.卧槽,第一次听说这种观点.那不是我也该被排除咯?粗心大意,脑子不好使,也非我愿.可是到底有什么办法能不加班呢?不是说好的每天工作8小时,幸福生活一辈子么,不知道现在大家在急什么.每天都有做

UWP取出图片主色调

一切都要从风车动漫的新详情页说起... 当我最初拿到风车动漫新详情页的UI设计概念图时,新详情页中有两点: 1.图片的高斯模糊 2.取出图片的主色调(主要用于tag和相关动漫的标题背景) 大概就是要这样: 由于高斯模糊是最近一个比较热门的东西,所以用的人比较多,也早就有大大给写好了UWP可用的版本 (参考)http://www.cnblogs.com/hebeiDGL/p/5427746.html 但是取出颜色的主色调明显就没有了... 最后在网上找到了这一篇帖子 http://bbs.csdn

SIFT解析(一)建立高斯金字塔

转自:honpey  http://blog.csdn.net/wendy709468104/article/details/8639617 SIFT(Scale-Invariant Feature Transform,尺度不变特征转换)在目标识别.图像配准领域具有广泛的应用,下面按照SIFT特征的算法流程对其进行简要介绍对SIFT特征做简要介绍. 高斯金字塔是SIFT特征提取的第一步,之后特征空间中极值点的确定,都是基于高斯金字塔,因此SIFT特征学习的第一步是如何建立的高斯金字塔. 明白几个

iOS开发探索-高斯模糊&amp;毛玻璃效果

iOS开发中有的时候需要将图片设置模糊,来实现特定的效果获取更好的用户体验, iOS7之后半透明模糊效果得到大范围使用的比较大,现在也可以看到很多应用局部用到了图片模糊效果,可以通过高斯模糊和毛玻璃效果达到图片模糊效果. 左边玻璃右边模糊 高斯模糊效果 1. CoreImage: iOS5.0之后就出现了Core Image的API,Core Image的API被放在CoreImage.framework库中, 在iOS和OS X平台上,Core Image都提供了大量的滤镜(Filter),在

图片高斯模糊处理应用-涉及libjpeg的使用,NDK对SurfaceView的操作,图像模糊处理,附源代码

转载请保留原文链接: http://write.blog.csdn.net/postedit/42400825 当今微博.朋友圈.各种社交平台上充斥着各种照片,自拍或者各种生活记录也多以照片为其主要的手段,可见照片对生活的重要性,所以图片处理软件几乎成为人们的必备软件之一. 由于人们对图片处理的需求较大,我希望能开发一款在生活中能使用的手机图片处理软件,于是我选取了一个应用场景,即人们在各种场合拍照时,只希望照片显示的重点是自己关注的内容,而非其他事物,但照片难免包含其他不愿意让别人看到的.无关

绘图与滤镜全面解析

iOS开发系列--打造自己的“美图秀秀” --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz 2D绘制2D图形和Core Image中强大的滤镜功能. Quartz 2D 基本图形绘制 视图刷新 其他图形上下文 Core Image Quartz 2D 在iOS中常用的绘图框架就是Quartz 2D,Quartz 2D是Core Graphics框

绘图与滤镜全面解析--Quartz 2D 、Core Image

绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz 2D绘制2D图形和Core Image中强大的滤镜功能. Quartz 2D 基本图形绘制 视图刷新 其他图形上下文 Core Image Quartz 2D 在iOS中常用的绘图框架就是Quartz 2D,Quartz 2D是Core Graphics框架的一部分,是一个强大的二维图像绘制引擎.Qu

GLSL实现滤镜效果

入门效果之浮雕 "浮雕"图象效果是指图像的前景前向凸出背景.常见于一些纪念碑的雕刻上,要实现浮雕其实非常简单.我们把图象的一个象素和左上方的象素进行求差运算,并加上一个灰度.这个灰度就是表示背景颜色.这里我们设置这个插值为128 (图象RGB的值是0-255).同时,我们还应该把这两个颜色的差值转换为亮度信息.否则浮雕图像会出现彩色. "precision mediump float; \n" "varying vec2 v_texCoord; \n&qu

【特征匹配】SURF原理与源码解析

SURF (Speed Up Robust Features)是SIFT改进版也是加速版,提高了检测特征点的速度,综合性能要优于SIFT. 下面先逐次介绍SURF的原理,最后解析opencv上SURF源码. 转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/47778143 1.积分图像 SURF是对积分图像进行操作,从而实现了加速,采用盒子滤波器计算每个像素点的Hessian矩阵行列式时,只需要几次加减法运算,而且运算量与盒子