algorithm - 理解 HSL 到 RGB 色彩空间转换算法

标签 algorithm colors

我已经阅读了wikipedia 中的HSLRGB 算法。 .我理解它并且可以使用它进行转换。但是我遇到了另一种算法 here ,数学得到“解释”here .

算法是:

//H, S and L input range = 0 ÷ 1.0
//R, G and B output range = 0 ÷ 255

if ( S == 0 )
{

   R = L * 255
   G = L * 255
   B = L * 255
}
else
{
   if ( L < 0.5 ) var_2 = L * ( 1 + S )
   else           var_2 = ( L + S ) - ( S * L )

   var_1 = 2 * L - var_2

   R = 255 * Hue_2_RGB( var_1, var_2, H + ( 1 / 3 ) )
   G = 255 * Hue_2_RGB( var_1, var_2, H )
   B = 255 * Hue_2_RGB( var_1, var_2, H - ( 1 / 3 ) )
}

Hue_2_RGB( v1, v2, vH )             //Function Hue_2_RGB
{
   if ( vH < 0 ) vH += 1
   if( vH > 1 ) vH -= 1
   if ( ( 6 * vH ) < 1 ) return ( v1 + ( v2 - v1 ) * 6 * vH )
   if ( ( 2 * vH ) < 1 ) return ( v2 )
   if ( ( 3 * vH ) < 2 ) return ( v1 + ( v2 - v1 ) * ( ( 2 / 3 ) - vH ) * 6)
   return ( v1 )
}

我试过按照数学计算,但我无法理解。它是如何工作的?

最佳答案

第一部分 if ( S == 0 ) 是针对没有饱和度的情况,这意味着它是灰色阴影。您设置亮度,将 RGB 设置为该灰度级别,然后就完成了。

如果不是这种情况,那么我们需要执行棘手的部分:

我们将使用var_1var_2 作为临时值,只是为了使代码更具可读性。

因此,如果亮度小于 0.5 (50%),则 var_2 = 亮度 x (1.0 + 饱和度。 如果亮度等于或大于 0.5 (50%),则 var_2 = 亮度 + 饱和度 – 亮度 x 饱和度。那是其他部分:

if ( L < 0.5 ) var_2 = L * ( 1 + S )
else           var_2 = ( L + S ) - ( S * L )

然后我们做:

var1 = 2 x Luminance – var_2

稍后会有用。

现在我们需要为每个颜色 channel 另外三个临时变量,就色调而言。对于红色,我们向其添加 0.333(代码中的 H + (1/3)),对于绿色,我们什么都不做,对于蓝色,我们从中减去 0.333(H + (1/3))。该临时值在 Hue_2_RGB() 中称为 vH(值 Hue)。

现在每个颜色 channel 将被单独处理,因此三个函数调用。有四个公式可以应用于颜色 channel 。每个颜色 channel 应该只“使用”一个公式。

哪一个?这取决于 Hue (vH) 的值。

顺便说一句,vH 的值必须归一化,因此如果它是负数我们加 1,或者如果它大于 1,我们从中减去 1,所以 vH 位于 [0 , 1].

  1. 如果 6 x vH 小于 1,颜色 channel = var_1 + (var_2 – var_1) x 6 x vH
  2. 如果 2 x vH 小于 1,颜色 channel = var_2
  3. 如果 3 x vH 小于 2,颜色 channel = var_1 + (var_2 – var_1) x (0.666 – vH) x 6
  4. 否则,颜色 channel = var_1

对于 R = 255 * Hue_2_RGB( var_1, var_2, H + ( 1/3 ) ),颜色 channel 将是红色,在代码中命名为 R .

关于algorithm - 理解 HSL 到 RGB 色彩空间转换算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46169415/

相关文章:

c - 了解快速求幂函数

linux - 通过不同颜色的变量打开emacs

javascript - 如何根据对象值更改 javascript 中的颜色

algorithm - 图中受约束的最短距离

Python替换字符串中的3个随机字符,不重复

java - ArrayList:java.lang.IndexOutOfBoundsException:索引:283,大小:283

algorithm - 大O题——算法分析

css - 0 因为饱和度和亮度不起作用但 0% 在 hsl/hsla 中起作用?

SwiftUI EaseIn Transition 通过多种颜色循环

android - EditText 颜色光标和标记