svg : feComposite 滤镜
本帖最后由 马黑黑 于 2023-10-20 07:38 编辑 <br /><br /><style>.ma p { margin: 8px 0; }
.rred { color: red; }
.ggreen { color: green; }
.ma > pre { padding: 16px; background: #efefef; font: normal 16px monospace; white-space: pre-wrap; word-wrap: break-word; tab-size: 4; line-height:1.5em; }
.mypic { filter: url(#f1); }
</style>
<div class="ma">
<p>feComposite 滤镜执行两个输入源的智能像素组合,在图像空间中使用 Porter-Duff(波特-达夫) 合成操作,例如 over、in、atop、xor 等中的任意一个,另外,还有一个智能组件 arithmetic 操作可供选用。</p>
<p>feComposite 语法:</p>
<pre><feComposite in="<span class="rred">源1</span>" in2="<span class="rred">源2</span>" operator="<span class="rred">合成方式</span>"><feComposite>
<span class="ggreen"><!-- 若启用智能组件 arithmetic ,还需加上 k1、k2、k3、k4 属性,k1 控制重叠的图像亮度,k2 控制输入源 in 亮度,k3 控制输入源 in2 的输入亮度,k4 亮度偏移量 --></span></pre>
<p>下面给出一个演示实例。例中,创建一个 f1 滤镜,内含两个 image 滤镜作为输入源,各带一张图片、各有自己的起始位置和宽高尺寸;feComposite 滤镜对两个输入源通过 in 和 in2 属性指定快照进行合成,默认以 over 方式合成,不同的 opertator 属性值(即波特-达夫合成方式)会产生不同的效果。然后,让 f1 滤镜应用到一个 div 标签中,该标签除了宽高尺寸和滤镜绑定属性,没有其他设置。基础代码如下:</p>
<pre>
<svg style="position: absolute; width: 0; height: 0;">
<span class="ggreen"><!-- 滤镜 --></span>
<filter id="f1">
<feImage x="10" y="10" width="100" height="100" href="https://638183.freep.cn/638183/t23/btn/hshx.png" result="honghua" />
<feImage x="0" y="0" width="474" height="266" href="https://638183.freep.cn/638183/t23/3/lake1.jpg" result="hupo" />
<feComposite in="honghua" in2="hupo" operator="<span class="rred">over</span>" />
<span class="ggreen"><!-- operator="arithmetic" 时,feComposite 标签要加入 k1="1" k2="0.1" k3="0.1" k4="0.2" --></span>
</filter>
</svg>
<span class="ggreen"><!-- div标签绑定 f1 滤镜 --></span>
<div style="width: 474px; height: 266px; <span class="rred">filter: url(#f1)</span>;"></div>
</pre>
<svg style="position: absolute; width: 0; height: 0;">
<filter id="f1">
<feImage x="10" y="10" width="100" height="100" href="https://638183.freep.cn/638183/t23/btn/hshx.png" result="honghua" />
<feImage x="0" y="0" width="474" height="266" href="https://638183.freep.cn/638183/t23/3/lake1.jpg" result="hupo" />
<feComposite in="honghua" in2="hupo" operator="over" k1="1" k2="0.1" k3="0.1" k4="0.2" id="fec"/>
</filter>
</svg>
<div style="width: 474px; height: 266px; filter: url(#f1);"><p>feComposite 滤镜</p></div>
<p id="btn">
<span>选择 operator >> </span>
<input type="button" value="over" disabled />
<input type="button" value="in" />
<input type="button" value="out" />
<input type="button" value="lighter" />
<input type="button" value="atop" />
<input type="button" value="xor" />
<input type="button" value="arithmetic" />
</p>
<p>基于 feComposite 滤镜,operator 属性值的含义如下:</p>
<pre>
over: in 属性中定义的源图形放置在 in2 属性中定义的目标图形上方
in: in 属性中定义的源图形的部分替换了 in2 属性中定义的目标图形
out: 他先是了在 in 属性中定义的源图形的各个部分
atop: 它显示源图形中与目标图形重叠的部分替换了目标图形
xor: 它显示了 in 属性中定义的源图形的非重叠区域与 in2 属性中定义的目标图形组合在一起
lighter: 它显示了分别显示在 in 和 in2 属性中定义的源图形和目标图形的总和
arithmatic: 它显示使用以下公式分别组合了in和in2属性中定义的源图形和目标图形:结果= k1 * i1 * i2 + k2 * i1 + k3 * i2 + k4
</pre>
<p>feComposite 滤镜可能相对抽象,同时,以上的演示,在不同浏览器下效果可能也不尽相同,不过,该滤镜更多地是与光滤镜合作,将来我们会有机会进一步熟悉它。</p>
</div>
<script>
let btns = document.querySelectorAll('#btn input');
let lastBtn = 0;
btns.forEach((item,key) => {
item.onclick = () => {
fec.setAttribute('operator',item.value);
btns.disabled = false;
item.disabled = true;
lastBtn = key;
};
});
</script>
k1-k4这个看得有点晕{:4_173:} “feComposite 滤镜可能相对抽象”应该说是十分抽象{:4_173:} 红影 发表于 2023-10-19 21:48
k1-k4这个看得有点晕
这个有计算公式,今后有余力再去研究 红影 发表于 2023-10-19 21:49
“feComposite 滤镜可能相对抽象”应该说是十分抽象
光滤镜都会用到它,所以这个要懂 马黑黑 发表于 2023-10-20 07:36
这个有计算公式,今后有余力再去研究
哦,这个原来还有公式的啊,还以为只是设置个数值呢{:4_173:} 马黑黑 发表于 2023-10-20 07:37
光滤镜都会用到它,所以这个要懂
嗯,今天看到光滤镜了,合成方式用到的还正好是智能组件 arithmetic
光滤镜真好看,很有立体感。对这个feComposite 计算不懂也要记下来{:4_187:} 红影 发表于 2023-10-20 14:22
哦,这个原来还有公式的啊,还以为只是设置个数值呢
它有一整套规范的 红影 发表于 2023-10-20 14:25
嗯,今天看到光滤镜了,合成方式用到的还正好是智能组件 arithmetic
光滤镜真好看,很有立体感。对这个 ...
太抽象,慢慢领会吧 马黑黑 发表于 2023-10-20 19:36
它有一整套规范的
等以后再深入了解吧,现在先学习各种滤镜{:4_173:} 马黑黑 发表于 2023-10-20 19:37
太抽象,慢慢领会吧
都还没接触到它的那套规范呢,现在只是知道有这么个东东{:4_173:} 红影 发表于 2023-10-20 20:11
都还没接触到它的那套规范呢,现在只是知道有这么个东东
这就差不多了 红影 发表于 2023-10-20 20:10
等以后再深入了解吧,现在先学习各种滤镜
根据需要,慢慢扩展 马黑黑 发表于 2023-10-20 23:33
这就差不多了
那我就放心了{:4_173:} 马黑黑 发表于 2023-10-20 23:34
根据需要,慢慢扩展
好的,先把你教的这些先学会了再说,扩展是以后的事。 红影 发表于 2023-10-21 10:56
好的,先把你教的这些先学会了再说,扩展是以后的事。
不能说“教”这个字。最近,家长在加给孩纸不可,都是违法的。 红影 发表于 2023-10-21 10:55
那我就放心了
放一百个心 马黑黑 发表于 2023-10-21 10:58
不能说“教”这个字。最近,家长在加给孩纸不可,都是违法的。
好吧,不提这个字。“学”这个字可以用吧{:4_173:} 马黑黑 发表于 2023-10-21 10:58
放一百个心
还放一千个心呢,哪来的那么多心啊{:4_196:} 红影 发表于 2023-10-21 13:31
还放一千个心呢,哪来的那么多心啊
那好,有一个放一个,有一百个放一百个,一个都不留