Неверное расчет насыщения в RGB к функции HSL
-
11-12-2019 - |
Вопрос
Никто знает правильную формулу, чтобы получить уровень насыщения от цвета RGB?
У меня уже есть функция, которая это делает. Я пробовал нагрузки из них, размещенных в Интернете, но только этот, казалось, работал (впервые) для меня, помимо уровня насыщения, которые иногда слегка выходят.
rgb(204,153,51)
должен равный генеракодицетагкод, вместо этого у меня есть генеракодицетагкод. Как вы можете видеть, что мой оттенок и легкость верны, на самом деле, насыщенность в основном правильно, но иногда это не и мне нужно исправить, если смогу.
Это то, что я построил до сих пор, поэтому я могу проверить все значения цвета верны для моих изображений, прежде чем хранить их в базе данных для моей поисковой системы.
И это проблема в зависимости от того, где я считаю, что насыщенность рассчитывается неправильно:
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%, состоит в том, что я сначала преобразующую шестигранное значение на RGB, затем RGB к HSL. Будет ли это проблемой из-за веб-безопасных цветов или вы можете обнаружить что-либо еще, что может вызвать это в функции? Или это только как это?
<Сильное> Обновление 1
Попытка других изображений, кажется, в основном «бежевый» (ок.) Цвета, которые немного насыщены. Используя сборщик цветов, если я перемещаю панель насыщения туда, где это должно быть, нет огромных различий, поэтому, возможно, моя функция поиска не будет забрать это слишком много. Было бы неплохо решить это, хотя, до я бегу на 500 000 фотографий.
<Сильные> Исправление
Благодаря
.
$S = $delta / $max;
to:
.
$S = $L > 0.5 ? $delta / (2 - $max - $min) : $delta / ($max + $min);
и теперь производит 100% правильные результаты.
Если кто-нибудь хотел бы, чтобы код создал этот цветной стол, просто спросите.
Решение
Похоже, вы пропустите кусок расчета для насыщения, если ваша люмана> .5 Как показано здесь, в этом JavaScript HSL Code .
var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
.