RGB转HSL函数中饱和度计算不正确

6

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

我已经有一个能够完成此任务的函数了。我尝试了很多在互联网上发布的函数,只有这个似乎对我有效(第一次),但饱和度水平有时会稍微偏差。

rgb(204,153,51) 应该等于 hsl(40,60,50),但我得到的是 hsl(40,75,50)。正如您所看到的,我的色相和亮度都是正确的,事实上,大多数情况下饱和度也正确,但有时候并非如此,如果可以的话,我需要进行修正。

这是我迄今为止构建的内容,以便在将图像存储到搜索引擎的数据库之前检查所有颜色值是否正确:

enter image description here

这是涉及到计算饱和度不正确的函数:

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;
}

我有一个线索,可以解释这不完全正常的原因。首先我将HEX颜色转换为RGB,然后再将RGB转换为HSL。这是否会因为Web安全颜色或其他原因而出现问题?或者这就是它的本质?尝试了其他图像后,似乎大多数“米色”(约)颜色的饱和度稍高。如果我将饱和度栏移到正确位置,差别不是很大,所以也许我的搜索功能不会太受影响。但在运行500,000张照片之前解决它会很好。感谢下面的OmnipotentEntity,他发现了我函数中缺失的部分。我做了以下更改:
$S = $delta / $max;

to:

$S = $L > 0.5 ? $delta / (2 - $max - $min) : $delta / ($max + $min);

现在的代码可以生成100%正确的结果。

友情提示

如果有人想要生成这个颜色表的代码,只需提出请求即可。

1个回答

2

看起来如果亮度大于.5,你似乎缺少饱和度计算的一部分,这里是JavaScript HSL代码

var q = l < 0.5 ? l * (1 + s) : l + s - l * s;

非常感谢,太棒了。我在 PHP 中添加了那一行重要的代码,现在它完美地运行了。 - TheCarver
我从一个流行的博客得到了那个函数,迫不及待地想回去留下评论! :) - TheCarver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接