Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php HSL到RGB的转换数学_Php_Colors_Rgb_Hsl - Fatal编程技术网

Php HSL到RGB的转换数学

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

当从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)
{
    $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位以上的双打,这可能与此有很大关系。谢谢你的想法。