有人知道从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张照片上运行它。
THE FIX
感谢下面的 OmnipotentEntity ,他注意到我错过了我的功能。我改变了:
$S = $delta / $max;
为:
$S = $L > 0.5 ? $delta / (2 - $max - $min) : $delta / ($max + $min);
现在产生100%正确的结果。
友情提示
如果有人想要代码来生成这个颜色表,请问。
答案 0 :(得分:2)
如果您的亮度是&gt;,您似乎错过了一段饱和度计算。 .5 as shown here in this JavaScript HSL code。
var q = l < 0.5 ? l * (1 + s) : l + s - l * s;