我正在尝试使用SVG过滤器来偏移并用特定的颜色填充形状。为了调整颜色,我使用<feColorMatrix>
。我知道颜色矩阵使用箝位值来表示颜色,所以我通过取R、G、B值(0-255(并将其除以256来计算箝位值。
问题是,这产生了一个浅得多的颜色。然后我尝试了一个简单的0.5,然后颜色选择了结果。我预计rgb(128128128(#80800或至少接近,但结果却是一个令人震惊的rgb(187187187(#bbbbbb。
<filter id="midgrey">
<feColorMatrix values="
0 0 0 0 0.5
0 0 0 0 0.5
0 0 0 0 0.5
0 0 0 1 0">
</feColorMatrix>
</filter>
显然,这里正在进行某种转换。经过一点测试,转换肯定是非线性的——某种指数重映射。
问题1:这在规范中的定义在哪里?我看了看,除了简短地提到使用sRGB颜色空间的滤镜外,找不到其他任何东西。这是原因吗
颜色插值过滤器对过滤器函数没有影响。Filter函数必须在sRGB颜色空间中操作
问题#2:如何将RGB三元组转换为该色标,以使生成的颜色在RGB空间中匹配
问题3:也许这是用SVG过滤器转换颜色的错误方法。有没有其他方法可以用特定的颜色填充形状
(注意,即使只为#3提供了答案,也能回答所有三个问题,这仍然很好(
TIA!
所以,首先,不要相信你在规范中读到的一切,尤其是当它们不是至少一个候选推荐。该过滤器规范已经研究了多年,许多与SVG 1.1规范不同的东西还没有实现。
在SVG 1.1(当前的跨浏览器基线(中,过滤器在linearRGB空间中运行。来自SVG规范(15.1(
("颜色插值滤波器"的初始值为linearRGB
(187187187(是在linearRGB空间中执行50%,然后使用sRGB滴管测量结果时发生的情况。为了超越它,你必须设置颜色插值过滤器=";sRGB";在您的滤芯中。
这是一种非常好的转换颜色的方法。正如Robert在评论中提到的那样,你也可以使用flood&
<filter id="flood-recolor">
<feFlood flood-color="grey"/>
<feComposite operator="in" in2="SourceGraphic"/>
</filter>