gpt4 book ai didi

html - 如何计算生成特定颜色所需的色调旋转?

转载 作者:数据小太阳 更新时间:2023-10-29 09:10:03 25 4
gpt4 key购买 nike

我有一个白色图像用作 div 的背景,我想上色以匹配主题主色。我知道我可以:

filter: sepia() saturate(10000%) hue-rotate(30deg);

并通过hue-rotate循环找到一种颜色,但是否可以提前计算出这个值?鉴于指定的十六进制值非常暗,我想我还需要包括 invert(%) 过滤器。

给定 #689d94 的十六进制值,我需要做哪些数学运算来计算所需的 hue-rotateinvert 值以进行转换我的白色背景图像变成相同的颜色?

编辑

这是一个 div 的片段,其中白色背景图像被过滤成绿色。这里的技巧是过滤整个 div,而不仅仅是图像。如果我要在 div 中输入一些文本,文本颜色也会变成绿色。

div {
background:url(http://richard.parnaby-king.co.uk/basket.svg) no-repeat scroll 0 0 transparent;
background-size:5em;
width:5em;
height:5em;
-webkit-filter: invert(25%) sepia() saturate(100000%) hue-rotate(174deg);
filter: invert(25%) sepia() saturate(100000%) hue-rotate(174deg);
}
<div></div>
<p style="background: #689d94">​</p>

最佳答案

本例中的关键是定义初始颜色。白色、黑色或任何灰度在技术上都是实际颜色——您不能对其进行饱和或旋转。您必须以某种方式对其进行“着色”,而棕褐色滤镜是唯一进行某种形式着色的滤镜。

如果您的图片是 100% 纯红色,那就更容易了。然后你可以直接添加目标度数并使用HSL为目标调整饱和度和亮度。对于白色起点,第一步是转换和定义中间色,以便稍后对其进行饱和和旋转。

首先让白色图像变暗并应用棕褐色以获得我们可以使用的“基础”颜色:

filter: brightness(50%) sepia(1);

这将产生大约为 RGB 颜色值:

rgb(178, 160, 128)

第二步是 convert that to HSL color-space这给了我们:

hsl(38, 24.5%, 60%);

基色结果

div {
background:url(http://richard.parnaby-king.co.uk/basket.svg) no-repeat;
background-size:5em;
width:5em;
height:5em;
-webkit-filter: brightness(50%) sepia(1);
filter: brightness(50%) sepia(1);
}
<div></div>

将基色转换为目标色

前两个步骤是静态的,每次我们需要找到目标调整时都会重复使用其结果(sepia 的实际值在 SVG Filters specification 中定义)。

现在我们需要计算我们需要将什么应用到这个基色以获得目标颜色。首先将目标颜色(例如问题中给出的#689d94)转换为 HSL:

hsl(170, 21.3%, 51.2%);

然后我们必须计算它们之间的差异。只需从目标中减去碱基即可计算出色调。饱和度和亮度相同,但由于我们假设 100% 的基值,我们需要从 100% 中减去结果以得出累积值的差异:

H:  170 - 38             ->  132°
S: 100 + (24.5 - 21.3) -> 103.2% (relative to base 100% = 3.2%)
L: 100 + (51.2 - 60.0) -> 91.2% (relative to base 100% = -8.8%)

通过将这些值附加到现有过滤器,将这些值转换为过滤器字符串,然后将其设置在 div 上:

/*      ------ base color ------  -------  new target -------------------------------*/
filter: brightness(50%) sepia(1) hue-rotate(132deg) saturate(103.2%) brightness(91.2%);

要设置它,假设已经声明了 filter 和 divElement,您可能会做这样的事情:

...
filter = "brightness(0.5) sepia(1) hue-rotate(132deg) saturate(103.2%) brightness(91.2%)";
divElement.style.filter = filter;
divElement.style.webkitFilter = filter;

请注意,可能存在舍入误差,因为 RGB 表示为整数,而 HSL 是 float ,因此实际结果可能不准确,但应该非常接近。

实例

div {
background:url(http://richard.parnaby-king.co.uk/basket.svg) no-repeat;
background-size:5em;
width:5em;
height:5em;
-webkit-filter:
brightness(50%) sepia(1) hue-rotate(132deg) saturate(103.2%) brightness(91.2%);
filter:
brightness(50%) sepia(1) hue-rotate(132deg) saturate(103.2%) brightness(91.2%);
}
<div></div>
<span style="font:14px sans-serif;padding:7px;color:#fff;background:#689d94">
Target color</span>

可行的备选方案是:

  • 使用已设置的颜色预定义 SVG。
  • 直接在 JavaScript 中使用 HSL/RGB,并直接使用形状的颜色修改 SVG 树,而不是使用滤镜。过滤器在性能方面是昂贵的,特别是如果许多过滤器像这里一样被链接起来,并且它们还是页面的主要部分。所有浏览器都不支持它们。

关于html - 如何计算生成特定颜色所需的色调旋转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29037023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com