了解HSL到RGB色彩空间转换算法

时间:2017-09-12 06:30:56

标签: algorithm colors

我已在wikipedia中读取 HSL RGB 算法。我理解它并且可以使用它进行转换。然而,我遇到了另一个算法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 )
}

我已经尝试过数学但我无法理解。它是如何工作的?

1 个答案:

答案 0 :(得分:1)

第一部分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

以后会有用。

现在我们需要另外三个临时变量用于每个颜色通道,只要Hue被保留。对于Red,我们在其中添加0.333(代码中为H + (1/3)),对于Green我们什么都不做,而对于Blue,我们从它中减去0.333(H + (1/3))。该临时值在vH中称为Hue_2_RGB()(值Hue)。

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

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

顺便说一下,vH的值必须归一化,因此如果它是负数我们加1,或者如果它大于1,我们从中减去1,这样vH就在[0,1]中

  1. 如果6 x vH小于1,则颜色通道= var_1 +(var_2 - var_1)x 6 x vH
  2. 如果2 x vH小于1,则颜色通道= var_2
  3. 如果3 x vH小于2,则颜色通道= var_1 +(var_2 - var_1) x(0.666 - vH)x 6
  4. 否则,Color channel = var_1
  5. 对于R = 255 * Hue_2_RGB( var_1, var_2, H + ( 1 / 3 ) ),颜色通道将为红色,代码中名为R