Pergunta

Alguém sabe a fórmula correta para obter o nível de saturação de uma cor RGB?

Eu já tenho uma função que faz isso.Eu tentei carrega eles postadas na internet, mas só isso parecia funcionar (primeiro tempo) para mim, além do nível de saturação, sendo, ocasionalmente, um pouco para fora.

rgb(204,153,51) deve ser igual hsl(40,60,50), em vez de eu ter hsl(40,75,50).Como você pode ver meu matiz e a leveza são corretas, de fato, a saturação é principalmente correto demais, mas às vezes não e preciso corrigir se eu posso.

Isso é o que eu construí até agora, para que eu possa verificar todos os valores de cor estão corretas para as minhas imagens, antes de guardá-los em um banco de dados para o meu motor de busca.

enter image description here

E esta é a função em questão, onde eu acredito que a saturação é calculado incorretamente:

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

Uma dica que eu tenho, como para por que isso não funciona 100%, é que eu sou o primeiro a conversão de um HEX de cor em RGB, em seguida, o RGB para um HSL.Isso seria um problema devido ao web-safe colors ou você pode localizar qualquer outra coisa que pode causar este na função?Ou isso é apenas como ele é?

ATUALIZAÇÃO 1

Tentando outras imagens, ela aparece principalmente 'bege' (aprox.) as cores que estão um pouco fora de saturação.Usando um seletor de cores, se eu mover a barra de saturação para onde ele deve estar lá não é uma grande diferença, então, talvez o meu recurso de pesquisa não pegar muito isso.Seria bom para resolvê-lo embora, antes de Eu executá-lo em 500,000 fotos.

A CORRECÇÃO

Graças a OmnipotentEntity, abaixo, ele notou que eu peça que faltava para a minha função.Eu mudei:

$S = $delta / $max;

para:

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

e agora produz 100% de resultados corretos.

AMIGÁVEL NOTA

Se alguém gostaria do código para produzir esta tabela de cores, é só pedir.

Foi útil?

Solução

Parece que falta um pedaço de cálculo para a saturação se o seu luma é > .5 como mostrado aqui neste JavaScript HSL código.

var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top