Php HSL到RGB的转换数学
当从HSL转换为RGB时,所涉及的数学似乎相对简单,尤其是在转换灰度时,因为RGB值是亮度乘以255 但是,使用此十六进制Php HSL到RGB的转换数学,php,colors,rgb,hsl,Php,Colors,Rgb,Hsl,当从HSL转换为RGB时,所涉及的数学似乎相对简单,尤其是在转换灰度时,因为RGB值是亮度乘以255 但是,使用此十六进制#eeeeee。它的RGB值是RGB(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) { $re
#eeeeee
。它的RGB值是RGB(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)];
在#eeeeeeee
的情况下,我们知道以下几点
$red = $green = $blue = 0.93;
所有的RGB值===238
我所看到的所有转换中的数学都没有叠加
0.93 * 255 = 237.15
(注意:rgb(237237237)产生十六进制
四舍五入后剩下237。因此,我们将结果更改为使用ciel
。这在这种情况下有效,但破坏了很多其他转换
在这一转变过程中,我遗漏了一个步骤(世界其他地方似乎也是如此)。有人知道如何准确地计算HSL的RGB值吗?根据@Lithis的评论,很明显问题在于HSL值的准确性。正如评论中指出的那样:
238 / 255 = 0.9333333 recurring
增加转换中的浮点精度将创建预期的十六进制代码。因此,不是:
0.93 * 255 = 237.15
我们与
0.93333 * 255 = 237.99915
比237.15更容易接受的结果不是0.93,而是0.93333。。。。因此,当你将255和0.93相乘时,没有得到238也就不足为奇了。从另一个角度看,从#000000到#ffffff有256个灰度值,但从0.00到1.00只有100个亮度值,所以在使用两位小数时,不可能有从RGB到HSL再到HSL的一对一映射。@Ithis我认识到这一点。HSL最多有100种真灰色,而十六进制代码则有256种。问题集中在如何将具有HSL表示和常用十六进制代码的RGB值准确地转换为RGB。尽管事实上,我没有研究小数点后3位以上的双打,这可能与此有很大关系。谢谢你的想法。