【发布时间】:2017-10-14 23:11:35
【问题描述】:
我正在尝试仅使用 SVG 滤镜模拟 mix-blend-mode:exclusion 混合模式。文档说排除是从较浅的颜色中减去较深的颜色,换句话说,较大的颜色分量值减去较小的颜色分量值。
有没有办法使用 SVG 过滤器来模拟这个逻辑?
原图为:
过滤后的图像将是:
要排除的颜色是#3a0339
为了您的方便,我带来了一些代码 sn-ps:
svg {
width: 0;
height: 0;
}
.myFilter {
filter: url(#myFilter);
}
<svg>
<defs>
<filter id="myFilter" x="0" y="0" width="100%" height="100%">
<feFlood result="fill" flood-color="#3a0339" flood-opacity="1">
</feFlood>
<feComposite operator="arithmetic" in="SourceGraphic" in2="fill" k1="0" k2="0.5" k3="0.5" k4="0"/>
</filter>
</defs>
</svg>
<img class="myFilter" src="https://i.stack.imgur.com/ux2FT.png">
【问题讨论】:
-
我认为这是不可能的。您可以通过组合两个 feBlends(屏幕和乘法)来接近,但最终的合成需要从另一个中减去一个。而且我认为没有办法在不将 Alpha 通道清零的情况下减去两种颜色。
-
@PaulLeBeau 所以所有计算实际上都涉及 alpha 通道,与其他通道的处理方式相同?
-
要减去它们,您需要使用
feComposite,但这也会减去 alpha,因此它们会抵消(即 1-1=0)。给你留下一个看不见的结果。 -
@PaulLeBeau 但是有办法提取 Alpha 通道吗?使用“feFuncA”或“SourceAlpha”。如果我可以在提取后以某种方式清除 alpha,然后再将其添加回来?
-
那行不通。过滤器基元结果是预乘的。因此,如果将 alpha 置零,颜色分量也会置零。反正没关系,我已经找到解决办法了,看我的回答。
标签: css svg filter svg-filters