马黑黑 发表于 2023-10-11 22:38

浅谈 svg 滤镜 in 属性

本帖最后由 马黑黑 于 2023-10-11 22:42 编辑 <br /><br /><style>
.ma p { margin: 8px 0; }
.rred { color: red; }
.ma > pre { padding: 16px; background: #efefef; font: normal 16px monospace; white-space: pre-wrap; word-wrap: break-word; tab-size: 4; }
</style>

<div class="ma">
        <p>svg 滤镜的 in 属性用于指定效果的输入源,可以是 svg 预设的内置值,也可以是某个滤镜的快照(result)。</p>
        <p>一、内置值</p>
        <p>svg 内置的 in 属性值共 6 个,但迄今为止,只有两个得到所有主流浏览器的支持,所以我们仅需要知道这两个值就可以了: <br><br>&nbsp;&nbsp;&nbsp; ① SourceGraphic,指定效果的输入源为整个图像;<br>&nbsp;&nbsp;&nbsp; ② SourceAlpha,指定滤镜效果的输入源是图像的Alpha通道,只使用元素的非透明部分,就是说,如果设定 in="SourceAlpha",其效果仅作用于图形的不透明的区域。</p>
        <pre>&lt;feGaussianBlur <span class="rred">in="SourceGraphic"</span> stdDeviation="5" /&gt;
&lt;feGaussianBlur <span class="rred">in="SourceAlpha"</span> stdDeviation="5" /&gt;</pre>
        <p>SourceGraphic 作用于整个图形,之前我们已经有过示例。SourceAlpha 作用于图形的 Alpha 通道,它作用于图形的非透明部分,下面给出代码与效果演示:</p>
        <pre>&lt;svg width="400" height="140"&gt;
        &lt;filter id="yinying"&gt;
                &lt;feGaussianBlur in="SourceAlpha" stdDeviation="5" result="mohu" /&gt;
                &lt;feOffset in="blur" dx="5" dy="8" result="pianyi" /&gt;
                &lt;feMerge&gt;
                        &lt;feMergeNode in="pianyi" /&gt;
                        &lt;feMergeNode in="SourceGraphic" /&gt;
                &lt;/feMerge&gt;
        &lt;/filter&gt;
        &lt;image href="https://638183.freep.cn/638183/t23/btn/hshx.png" /&gt;
        &lt;image x="140" href="https://638183.freep.cn/638183/t23/btn/hshx.png" filter="url(#yinying)" /&gt;
&lt;/svg&gt;
</pre>
        <p>代码解析:首先,我们设置了一个高斯模糊滤镜,它作用于Alpha源,我们还给它建立了一个快照 mohu;接着,我们创建一个偏移滤镜,它作用于快照名为 mohu 的高斯滤镜,自己也有一个快照名称 pianyi;最后,我们通过 feMerge 滤镜将图像与滤镜合并:将快照名为 pianyi 的滤镜合并到整个图像(in="SourceGraphic")。下面是效果,第一个图形未使用滤镜,第二个图形使用了 id="yinying" 的滤镜:</p>
        <svg width="400" height="140">
                <filter id="yinying">
                        <feGaussianBlur in="SourceAlpha" stdDeviation="5" result="mohu"></feGaussianBlur>
                        <feOffset in="mohu" dx="5" dy="8" result="pianyi"></feOffset>
                        <feMerge>
                                <feMergeNode in="pianyi"></feMergeNode>
                                <feMergeNode in="SourceGraphic"></feMergeNode>
                        </feMerge>
                </filter>
        <image href="https://638183.freep.cn/638183/t23/btn/hshx.png"></image>
        <image x="140" href="https://638183.freep.cn/638183/t23/btn/hshx.png" filter="url(#yinying)"></image>
</svg>
        <p>上面的示例可以这么理解:高斯模糊滤镜在源图像的基础上创建了一个黑白模糊的图像,偏移滤镜则将之向右向下偏移一定距离,然后合并源和滤镜,合并滤镜的第一个作用于偏移滤镜,而偏移滤镜作用于模糊滤镜,合并滤镜的第二个作用于整个图像,亦即原图像待在原位不动,动的是模糊滤镜的图像。合并的顺序至关重要,大家可以试着变换一下 feMergeNode 的顺序看看效果。</p>
        <p>二、快照值</p>
        <p>滤镜 in 属性还可以应用于 result 快照,就是我们给某个滤镜设定的 result 值。上例,feGaussianBlur 滤镜我们设定了 result="mohu" 快照,feOffset 滤镜的 in 属性值就是它,意思就是,feOffset 偏移滤镜作用于快照名为 mohu 的滤镜。这里就不再举例。</p>

</div>

红影 发表于 2023-10-11 22:51

这个,的确感觉到了复杂{:4_173:}

马黑黑 发表于 2023-10-11 22:59

红影 发表于 2023-10-11 22:51
这个,的确感觉到了复杂

in 属性本身不复杂,具体应用就有些复杂了,这是因为需要合并。

红影 发表于 2023-10-11 23:01

变换了一下合并的顺序,结果黑白模糊就跑到上面来了{:4_173:}

红影 发表于 2023-10-11 23:04

“高斯模糊滤镜在源图像的基础上创建了一个黑白模糊的图像”,是因为in="SourceAlpha"么。原来输入源使用元素的非透明部分得到的就是黑白效果啊。

红影 发表于 2023-10-11 23:06

这个SourceAlpha只对.png图片有效吧?
感觉得到的黑白模糊看着比原图小呢。

红影 发表于 2023-10-11 23:25

马黑黑 发表于 2023-10-11 22:59
in 属性本身不复杂,具体应用就有些复杂了,这是因为需要合并。

是的,只有2个得到支持的,的确不多。

马黑黑 发表于 2023-10-11 23:27

红影 发表于 2023-10-11 23:25
是的,只有2个得到支持的,的确不多。

再加上自定义的快照

马黑黑 发表于 2023-10-11 23:31

红影 发表于 2023-10-11 23:06
这个SourceAlpha只对.png图片有效吧?
感觉得到的黑白模糊看着比原图小呢。

所有。凡有非透明元素的。

红影 发表于 2023-10-12 09:39

马黑黑 发表于 2023-10-11 23:27
再加上自定义的快照

快照是个新概念,这个还需要努力熟悉起来。

红影 发表于 2023-10-12 09:40

马黑黑 发表于 2023-10-11 23:31
所有。凡有非透明元素的。

如果不是.png图片,整体图片都是非透明啊。

马黑黑 发表于 2023-10-12 18:02

红影 发表于 2023-10-12 09:40
如果不是.png图片,整体图片都是非透明啊。

那它就作用于整个图片

马黑黑 发表于 2023-10-12 18:03

红影 发表于 2023-10-12 09:39
快照是个新概念,这个还需要努力熟悉起来。
所谓快照,就是给对象(比如滤镜)一个临时名称用以做标识,方便在后续使用它

红影 发表于 2023-10-12 20:21

马黑黑 发表于 2023-10-12 18:02
那它就作用于整个图片

哦,知道了{:4_204:}

红影 发表于 2023-10-12 20:21

马黑黑 发表于 2023-10-12 18:03
所谓快照,就是给对象(比如滤镜)一个临时名称用以做标识,方便在后续使用它

嗯嗯,等于给对象一个身份标志,便于使用它。

马黑黑 发表于 2023-10-12 20:39

红影 发表于 2023-10-12 20:21
嗯嗯,等于给对象一个身份标志,便于使用它。

相当于临时身份证。这在svg滤镜中很常见。

马黑黑 发表于 2023-10-12 20:40

红影 发表于 2023-10-12 20:21
哦,知道了

{:4_190:}

红影 发表于 2023-10-12 21:14

马黑黑 发表于 2023-10-12 20:39
相当于临时身份证。这在svg滤镜中很常见。

是的,看到好几次了{:4_173:}

红影 发表于 2023-10-12 21:14

马黑黑 发表于 2023-10-12 20:40


谢谢{:4_204:}

马黑黑 发表于 2023-10-12 22:22

红影 发表于 2023-10-12 21:14
谢谢

客气
页: [1] 2 3 4 5 6 7 8
查看完整版本: 浅谈 svg 滤镜 in 属性