【发布时间】:2021-08-07 23:51:48
【问题描述】:
这与Using SVG for additive color mixing (additive blending) 不同,后者专门讨论加法混合。为此,它就像设置mix-blend-mode: screen 一样简单。据我所知,没有混合混合模式可以平均颜色。如那里的答案所述,对此的答案可能确实涉及使用过滤器;但是问题如何?
我正在制作一个应用程序,您可以在其中查看一些 SVG 数据。 SVG 具有不同颜色的图层,其中包含各种形状/路径。图层的颜色和形状/路径是输入并变化的。
一个示例 SVG 可能如下所示:
<svg>
<g fill="#ff0000" id="layer1">
<path d="M0,50 a50 50 0 1 1 100,0 a50 50 0 1 1 -100,0"/>
</g>
<g fill="#00ff00" id="layer2">
<path d="M25,50 a50 50 0 1 1 100,0 a50 50 0 1 1 -100,0"/>
</g>
<g fill="#0000ff" id="layer3">
<path d="M12.5,75 a50 50 0 1 1 100,0 a50 50 0 1 1 -100,0"/>
</g>
<!-- more layers... -->
</svg>
看起来像下图中的第一组圆圈(普通)。
我想要的是能够切换“透明模式”,这样您就可以看到隐藏在其他形状下方的形状。因此,如果两个形状在一个区域中重叠,则该区域的颜色应该是两个图层颜色的平均值。如果只有一个形状不重叠任何东西,颜色应该只是图层的颜色。 平均而言,我的意思是如果颜色“#00ff00”之上还有颜色“#ff0000”,则生成的颜色应该是“#7f7f00”。
我可以通过将所有内容绘制两次来获得弱透明效果(中间图片):以完全不透明度绘制所有内容,然后以一半不透明度再次在顶部绘制。但是效果很弱,并没有真正显示出真正的“混合”颜色。
这张图希望能说明我想要的效果(右图):
只要最终结果看起来正确,我不介意使用一些 hacky 来实现这一点。
【问题讨论】:
标签: javascript html css svg svg-filters