我已在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 )
}
我已经尝试过数学但我无法理解。它是如何工作的?
答案 0 :(得分:1)
第一部分if ( S == 0 )
适用于没有饱和度的情况,这意味着它是一片灰色阴影。您设置亮度,将RGB设置为该灰度级,您就完成了。
如果不是这种情况,那么我们需要执行棘手的部分:
我们将使用var_1
和var_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]中
对于R = 255 * Hue_2_RGB( var_1, var_2, H + ( 1 / 3 ) )
,颜色通道将为红色,代码中名为R
。