Вопрос

Никто знает правильную формулу, чтобы получить уровень насыщения от цвета 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 фотографий.

<Сильные> Исправление

Благодаря OMNIPOTENTENTITITITY , ниже, он заметил, что я не пропустил кусок к моей функции. Я изменил:

$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;
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top