我的问题是:给定目标RGB颜色,仅使用CSS过滤器将黑色(#000
)重新着色为该颜色的公式是什么?
对于被接受的答案,它需要提供一个函数(任何语言),该函数将接受目标颜色作为参数,并返回相应的CSSfilter
字符串。
其上下文是需要对background-image
内的SVG重新着色。在这种情况下,它将支持KATEX中的某些TeX数学功能:https://github.com/Khan/KaTeX/issues/587。
如果目标颜色#ffff00
(黄色),则一个正确的解决方案是:
filter: invert(100%) sepia() saturate(10000%) hue-rotate(0deg)
(演示)
强力搜索固定筛选器列表的参数:https://stackoverflow.com/a/43959856/181228
缺点:效率低下,只能生成16,777,216种可能颜色中的一部分(676,248种,_ABC_为0)。
drop-shadow
解决方案:
https://stackoverflow.com/a/43959853/181228
缺点:在边缘上不起作用。需要非filter
CSS更改和较小的HTML更改。
您仍然可以通过提交非强力解决方案来获得已接受答案!
如何计算hue-rotate
和sepia
:
https://stackoverflow.com/a/29521147/181228.
Ruby实现示例:
LUM_R = 0.2126; LUM_G = 0.7152; LUM_B = 0.0722
HUE_R = 0.1430; HUE_G = 0.1400; HUE_B = 0.2830
def clamp(num)
[0, [255, num].min].max.round
end
def hue_rotate(r, g, b, angle)
angle = (angle % 360 + 360) % 360
cos = Math.cos(angle * Math::PI / 180)
sin = Math.sin(angle * Math::PI / 180)
[clamp(
r * ( LUM_R + (1 - LUM_R) * cos - LUM_R * sin ) +
g * ( LUM_G - LUM_G * cos - LUM_G * sin ) +
b * ( LUM_B - LUM_B * cos + (1 - LUM_B) * sin )),
clamp(
r * ( LUM_R - LUM_R * cos + HUE_R * sin ) +
g * ( LUM_G + (1 - LUM_G) * cos + HUE_G * sin ) +
b * ( LUM_B - LUM_B * cos - HUE_B * sin )),
clamp(
r * ( LUM_R - LUM_R * cos - (1 - LUM_R) * sin ) +
g * ( LUM_G - LUM_G * cos + LUM_G * sin ) +
b * ( LUM_B + (1 - LUM_B) * cos + LUM_B * sin ))]
end
def sepia(r, g, b)
[r * 0.393 + g * 0.769 + b * 0.189,
r * 0.349 + g * 0.686 + b * 0.168,
r * 0.272 + g * 0.534 + b * 0.131]
end
注意,上述clamp
使得hue-rotate
为非线性函数。
演示:从灰度颜色到非灰度颜色: https://stackoverflow.com/a/25524145/181228
公式(来自类似的问题):
https://stackoverflow.com/a/29958459/181228
详细解释为什么上面的公式是错误的(CSShue-rotate
不是真正的色调旋转而是线性近似):
https://stackoverflow.com/a/19325417/2441511