我已经阅读了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 )
}
我试过按照数学计算,但我无法理解。它是如何工作的?
最佳答案
第一部分 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
稍后会有用。
现在我们需要为每个颜色 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].
- 如果 6 x vH 小于 1,颜色 channel = var_1 + (var_2 – var_1) x 6 x vH
- 如果 2 x vH 小于 1,颜色 channel = var_2
- 如果 3 x vH 小于 2,颜色 channel = var_1 + (var_2 – var_1) x (0.666 – vH) x 6
- 否则,颜色 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/