【发布时间】:2015-03-21 17:42:41
【问题描述】:
希望调整图像中绿色通道的色调值。具体来说,将绿色值(仅)更改为真正的深绿色或黑色。使用 svg 过滤器有什么想法吗?
【问题讨论】:
标签: svg svg-filters css-filters
希望调整图像中绿色通道的色调值。具体来说,将绿色值(仅)更改为真正的深绿色或黑色。使用 svg 过滤器有什么想法吗?
【问题讨论】:
标签: svg svg-filters css-filters
你想要SVG feColorMatrix 和type="matrix"。然后丢弃红色/蓝色通道,将绿色与绿色相乘,使其更暗。
具体来说,要将 RGBA 图像转换为仅使用绿色通道并将其变暗一半(并且无论原始 alpha 是什么都具有完整的 alpha),您需要这些矩阵值:
/*R G B A 1 */
0 0 0 0 0 // R = 0*R + 0*G + 0*B + 0*A + 0*1
0 0.5 0 0 0 // G = 0*R + 0.5*G + 0*B + 0*A + 0*1
0 0 0 0 0 // B = 0*R + 0*G + 0*B + 0*A + 0*1
0 0 0 0 1 // A = 0*R + 0*G + 0*B + 0*A + 1*1
<filter id="darkGreen">
<feColorMatrix type="matrix" values="0 0 0 0 0
0 0.5 0 0 0
0 0 0 0 0
0 0 0 0 1" />
</filter>
您不必像这样将值排列在网格中,但我更喜欢这样做,以便更清楚地了解发生了什么,并使其更易于编辑。
或者,您可以使用:
<feComponentTransfer>
<feFuncR type="linear" slope="0" />
<feFuncG type="linear" slope="0.5" />
<feFuncB type="linear" slope="0" />
</feComponentTransfer>
编辑:重新阅读您的问题,我想知道您是否想保持红色和蓝色通道完好无损。如果是这样,您需要类似以下的值,将红色复制到红色和蓝色到蓝色,但将绿色通道变暗到其原始亮度的 40%:
<filter id="darkenGreen">
<feColorMatrix type="matrix" values="1 0 0 0 0
0 0.4 0 0 0
0 0 1 0 0
0 0 0 0 1" />
</filter>
或者,您可以使用:
<feComponentTransfer>
<feFuncG type="linear" slope="0.4" />
<!-- the other channels will default to type="identity" -->
</feComponentTransfer>
【讨论】:
feColorMatrix 文档中描述的luminanceToAlpha 选项中看到此示例(以及一些良好的权重值)。