RGB到HSL功能的饱和度计算不正确

The*_*ver 5 php hsl rgb colors color-palette

有人知道从RGB颜色获得饱和度的正确公式吗?

我已经有了一个功能.我已经尝试过在互联网上发布的大量内容,但只有这一个似乎对我有用(第一次),除了饱和度水平偶尔会稍微偏离.

rgb(204,153,51)应该相等hsl(40,60,50),而不是我hsl(40,75,50).你可以看到我的色调和亮度是正确的,事实上,饱和度大多也是正确的,但有时它不是,我需要纠正,如果可以的话.

这是我到目前为止构建的,所以我可以检查我的图像的所有颜色值是否正确,然后将它们存储在我的搜索引擎的数据库中.

在此输入图像描述

这是我认为饱和度计算错误的问题:

function RGBtoHSL($red, $green, $blue)
{
    $r = $red / 255.0;
    $g = $green / 255.0;
    $b = $blue / 255.0;
    $H = 0;
    $S = 0;
    $V = 0;

    $min = min($r,$g,$b);
    $max = max($r,$g,$b);
    $delta = ($max - $min);

    $L = ($max + $min) / 2.0;

    if($delta == 0) {
        $H = 0;
        $S = 0;
    } else {
        $S = $delta / $max;

        $dR = ((($max - $r) / 6) + ($delta / 2)) / $delta;
        $dG = ((($max - $g) / 6) + ($delta / 2)) / $delta;
        $dB = ((($max - $b) / 6) + ($delta / 2)) / $delta;

        if ($r == $max)
            $H = $dB - $dG;
        else if($g == $max)
            $H = (1/3) + $dR - $dB;
        else
            $H = (2/3) + $dG - $dR;

        if ($H < 0)
            $H += 1;
        if ($H > 1)
            $H -= 1;
    }
    $HSL = ($H*360).', '.($S*100).', '.round(($L*100),0);
    return $HSL;
}
Run Code Online (Sandbox Code Playgroud)

我有一个线索,为什么这不能100%工作,我首先将HEX颜色转换为RGB,然后将RGB转换为HSL.由于网页安全的颜色,这会是一个问题,还是你能发现可能导致这个功能的其他任何问题?或者这是怎么回事?

更新1

尝试其他图像时,它似乎主要是"米色"(近似)颜色,在饱和度上稍微偏差.使用颜色选择器,如果我将饱和度条移动到它应该存在的位置,则没有太大差异,因此我的搜索功能可能不会过多.我用500,000张照片运行它之前解决它会很好.

固定

感谢下面的OmnipotentEntity,他注意到我错过了我的功能.我变了:

$S = $delta / $max;
Run Code Online (Sandbox Code Playgroud)

至:

$S = $L > 0.5 ? $delta / (2 - $max - $min) : $delta / ($max + $min);
Run Code Online (Sandbox Code Playgroud)

现在产生100%正确的结果.

友好的说明

如果有人想要代码生成这个颜色表,请问.

Omn*_*ity 2

如果您的亮度 > .5 ,如 JavaScript HSL 代码所示,您\xe2\x80\x99 似乎缺少了饱和度计算的一部分。

\n\n
var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n
Run Code Online (Sandbox Code Playgroud)\n