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
更容易接受
从 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