HSL 到 RGB 转换数学

HSL to RGB conversion math

从 HSL 转换为 RGB 时,涉及的数学看起来相对简单,尤其是在转换灰度时,因为 RGB 值是亮度乘以 255。

但是取这个十六进制#eeeeee。它的 RGB 值是 rgb(238,238,238),它的 HSL 表示是 hsl(0.00, 0.00, 0.93).

我发现的每个对转换的引用都是这样做的:

// Hard coded values for brevity
$hue = 0.00;
$saturation = 0.00;
$lightness = 0.00;

if ($saturation == 0)
{
    $red = $green = $blue = $lightness;
}
else
{
    // Or run the math
}

$rgb = [round($red * 255), round($green * 255), round($blue * 255)];

#eeeeee的情况下,我们知道以下

$red = $green = $blue = 0.93;

所有 RGB 值 === 238。

我看到的所有转换中的数学运算都不叠加。

0.93 * 255 = 237.15

(作为注释 rgb(237,237,237) 生成十六进制 #ededed

四舍五入后剩下 237。因此我们将结果更改为使用 ciel。好吧,这适用于这种情况,但会破坏很多其他转换。

我缺少此转换中的一个步骤(世界其他地方似乎也是如此)。有谁知道如何准确从 HSL 计算 RGB 值?

根据@Lithis 的评论,很明显问题出在 HSL 值的准确性上。正如评论中指出的那样:

238 / 255 = 0.9333333 recurring

提高转换中的浮点精度会创建预期的十六进制代码。所以而不是:

0.93 * 255 = 237.15

我们与

合作
0.93333 * 255 = 237.99915

这个结果比 237.15

更容易接受