RGB 到 HSL 函数中的饱和度计算不正确
-
11-12-2019 - |
题
有人知道从 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;
}
关于为什么这不能 100% 工作,我得到的一个线索是,我首先将 HEX 颜色转换为 RGB,然后将 RGB 转换为 HSL。这是否是由于网络安全颜色造成的问题,或者您能在函数中发现任何其他可能导致此问题的问题吗?或者事情就是这样?
更新1
尝试其他图像,它似乎主要是“米色”(大约)颜色,饱和度稍有不足。使用颜色选择器,如果我将饱和度条移动到应有的位置,则不会有很大的差异,所以也许我的搜索功能不会对此进行太多处理。不过能解决就好了 前 我在 500,000 张照片上运行了它。
修复方法
谢谢 全能实体, ,在下面,他注意到我的功能缺失了一部分。我变了:
$S = $delta / $max;
到:
$S = $L > 0.5 ? $delta / (2 - $max - $min) : $delta / ($max + $min);
现在产生 100% 正确的结果。
友情提示
如果有人想要生成此颜色表的代码,请询问。
解决方案
如果您的亮度 > 0.5,您似乎遗漏了饱和度计算的一部分 如 JavaScript HSL 代码所示.
var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
不隶属于 StackOverflow