当前位置: 首页 > 面试题库 >

如何计算所需的色相旋转以生成特定的颜色?

陈茂
2023-03-14
问题内容

我有一张白色图片,正在用作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>

问题答案:

在这种情况下,关键是定义初始颜色。从白色到黑色或任何灰度,从技术上来说都是真实的颜色-
您不能使其饱和或旋转。您必须以某种方式对其进行“着色”,而棕褐色滤镜是唯一进行某种形式着色的滤镜。

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

首先,使白色图像变暗并应用棕褐色以获得可以与之配合使用的“基础”颜色:

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

这将产生大约RGB颜色值:

rgb(178, 160, 128)

第二步是将其转换为HSL颜色空间,从而得到:

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>

将基本色转换为目标色

这两个第一步是静态的,每当我们需要查找目标调整时(其 乌贼墨 的实际值在SVG过滤器规范中定义),其结果都将被重用。

现在,我们需要计算需要应用到该基础颜色的颜色以获得目标颜色。首先将目标颜色(例如问题中给定的#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是浮点数,因此可能会产生舍入误差,因此实际结果可能不准确,但应该非常接近。

现场例子

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树,而不是使用滤镜。过滤器在性能上是昂贵的,特别是如果许多过滤器如此处那样链接在一起,并且它们另外是页面的主要部分。所有浏览器均不支持它们。


 类似资料:
  • 我有一个白色的图像,我用作为一个div的背景,我想颜色匹配的主题主色。我知道我能做到: 并循环遍历以查找颜色,但是否可以提前计算此值?鉴于指定的十六进制值相当暗,我想我还需要包含过滤器。 给定十六进制值为 我需要执行哪些数学运算来计算所需的和值,以将白色背景图像转换为相同的颜色? 这是一个的片段,其中白色背景图像被过滤为绿色。这里的技巧是,正在过滤的是整个,而不仅仅是图像。如果我要在中输入一些文本

  • 问题内容: 我想将matplotlib的标准颜色旋转更改为另一个颜色图。具体来说,我想使用“ gdist_rainbow”。那有可能吗,如果可以的话,我该如何实现呢? 我已经有自定义设置,例如 所以我想我只是在寻找要添加的正确键。 问题答案: 您需要为rcParameter提供一个颜色循环。一个颜色循环由颜色列表组成。可以根据颜色图进行选择。请参见下面的示例:

  • 问题内容: 特别是我的图像在透明的情况下都是纯黑色的。我想在绘制图像时为图像分配简单的颜色,以便将黑色区域更改为新颜色。 我尝试使用仅返回所需颜色的RGBImageFilter,但出现了问题,根本没有绘制任何内容。(ColourFilter扩展了RGBImageFilter,并仅在其filterRGB()方法中返回设置的颜色。) 问题答案: 查看AlphaComposites,尤其是DST_IN:

  • 问题内容: 似乎比它要简单得多,但是如何用python生成所有16,777,255个rgb颜色呢? 问题答案: 颜色通常用十六进制数表示,实际上只是整数。因此,从0到16,777,215(0xFFFFFF)的简单循环就足以生成所有24位RGB颜色。 在python 2.x中,您可以执行以下操作:

  • 问题内容: 我在下面编写了两种方法来自动选择N种不同的颜色。它通过在RGB立方体上定义分段线性函数来工作。这样做的好处是,如果你想要的话,你也可以得到一个渐进的比例,但是当N变大时,颜色可能开始看起来相似。我还可以想象将RGB多维数据集均匀细分为一个格子,然后绘制点。有人知道其他方法吗?我不打算定义一个列表,然后循环浏览它。我还应该说,我通常不在乎它们是否发生冲突或看起来不太好,它们只在视觉上有所

  • 问题内容: 我正在尝试生成特定计算机唯一的ID。该ID不会随机生成。这将基于计算,以便为计算机A生成的ID将是固定的,并且对于计算机A是唯一的。每次在计算机A上执行程序时,它将继续生成相同的ID,并且在另一台计算机上执行时,它将生成该计算机唯一的另一个ID。这是为了确保两台​​计算机没有相同的ID。 我的挑战: 为了使我的程序能够生成计算机唯一的ID,它需要基于执行该计算机的计算机唯一的种子来执行