我有一个白色的图像,我正在使用作为背景的div,我想颜色匹配的主题主颜色。我知道我可以做:
filter: sepia() saturate(10000%) hue-rotate(30deg);
并循环hue-rotate
以查找颜色,但是否可以提前计算该值?鉴于指定的十六进制值非常暗,我想我还需要包括invert(%)
过滤器。
给定#689d94
的十六进制值,我需要做什么数学运算来计算所需的hue-rotate
和invert
值,以将白色背景图像转换为相同的颜色?
编辑
这是一个div
的片段,白色背景的图像被过滤成绿色。这里的技巧是,过滤的是整个div
,而不仅仅是图像。如果我在div
中输入一些文本,文本的颜色也会变成绿色。
x一个一个一个一个x一个一个二个x
6条答案
按热度按时间ezykj2lf1#
这种情况下的关键是定义一个初始颜色。白色、黑色或任何灰度在技术上都是一种实际的颜色--你不能饱和或旋转它。你必须以某种方式"着色"它,而棕褐色滤镜是唯一一个可以进行某种形式着色的滤镜。
如果你的图像是纯100%红色,那就更容易了。然后你可以直接添加目标度数,并使用HSL作为目标来调整饱和度和亮度。对于白色的起始点,第一步是转换和定义一个中间色,以便我们稍后可以饱和和旋转它。
让我们首先变暗的白色图像和应用棕褐色得到一个"基地"的颜色,我们可以工作:
这将产生大约为以下值的RGB颜色值:
第二步是convert that to HSL color-space,它给出:
基色结果
一个三个三个一个
将基色转换为目标色
前两步是静态的,每次我们需要找到目标调整时都会重用其结果(* sepia * 的实际值在SVG Filters规范中定义)。
现在,我们需要计算需要应用于此基色以获得目标色的内容。首先,将目标色(例如问题中给出的#689d94)转换为HSL:
然后我们需要计算它们之间的差异。色相是通过简单地从目标值中减去基础值来计算的。饱和度和亮度也是如此,但由于我们假设基础值为100%,所以我们需要从100%中减去结果,以获得累积值的差异:
将这些值转换为filter-string,方法是将其附加到现有的filter,然后将其设置在div上:
要设置它,你可能会做类似这样的事情,假设filter和divElement已经声明:
请注意,由于RGB表示为整数,而HSL表示为浮点,因此可能存在舍入误差,因此实际结果可能不精确,但应该非常接近。
真实的例子
可行的备选方案有:
cfh9epnr2#
公认的答案是错误的。色调旋转不保留饱和度或亮度,你必须做疯狂的数学来得出正确的值。更简单的方法-这将导致正确的结果-是做一个CSS过滤器引用SVG过滤器。在SVG过滤器中的feColorMatrix原语允许你直接挑选颜色。
以颜色#424242为例,将每个RGB通道值除以#FF,并将它们放入第五列,即颜色矩阵的前三行。在本例中,hex #42是十进制的68,因此除以255(十进制的#FF),您将得到0.257,将其放入第五列,即前三行。
sulc1iza3#
获得精确匹配的唯一方法是使用SVG颜色矩阵滤镜。
对于RGB颜色
#689d94
(即rgb(104, 157, 148)
),将每个原色的值除以255:将这些权重放入SVG
<filter>
矩阵 (前3行中的5列):<filter>
必须有id(我使用的是RGB十六进制代码689d94
),因此我们可以将其用作参考。由于一些浏览器(例如Firefox)在SVG元素的
display
属性设置为none
时看不到/使用SVG过滤器,并且在HTML代码中包含此SVG元素会不方便地占用一些空间,因此最好的方法是将此SVG转换为纯内联CSS过滤器。要获取inline filter值,请使用上面列出的SVG代码,通过删除换行符和不必要的空格将其转换为一行,然后将
url('data:image/svg+xml,
作为前缀,并将前面提到的id作为#689d94')
附加:x一个一个一个一个x一个一个二个x
q7solyqu4#
十六进制颜色到CSS滤镜转换器
使用此网站计算过滤器:* * 一个
hlswsv355#
下面是C#中的一个扩展方法(感谢Ωmega提供的知识):
以下是用法:
剃刀在这里:
我在底部的剃刀上加了这个CSS
gzszwxb46#
如果正在使用SVG,则...
你可以用一些文本编辑器打开svg文件,复制并粘贴到html文件,然后根据需要更改路径颜色。
在下面的示例代码...我只是改变了中心环的路径颜色。希望这有帮助...
用于背景图像
一个一个二个一个一个一个三个一个一个一个一个一个四个一个