Use valores RGB de cor para determinar uma cor de contraste

Use valores RGB de cor para determinar uma cor de contraste

Estou criando um tema de projetor personalizado e defini um comando para definir as cores usadas na apresentação assim: \definecolor{primarycolor}{HTML}{9C27B0}(roxo, aliás).
Digamos primarycolorque seja a cor de fundo de um quadro.

Agora, quero poder calcular o brilho/luminância de uma determinada cor para determinar uma cor adequada para o texto (preto ou branco). No caso do roxo, o branco seria uma cor de texto legível.

Eu faria assim (pseudocódigo):
luminance := 0.2126 * Red + 0.7152 * Green + 0.0722 * Blue
textcolor := luminance < 128 ? black : white

Como obtenho os valores RGB de uma cor e depois determino a "cor de contraste" (preto ou branco)?

Responder1

Aqui está minha solução para determinar a luminosidade de uma cor e depois decidir sobre uma cor de contraste (não é limpa, mas funciona):

\RequirePackage{xcolor, etoolbox, xstring}
\definecolor{LightBlue}{HTML}{03A9F4}
\extractcolorspecs{grayScaleColor}{\modelspec}{\grayscale}


\StrBehind[1]{\grayscale}{0.}[\nbrstring]
\StrLeft{\nbrstring}{1}[\nbr]
\ifnumcomp{\nbr}{>}{5}{ % Brighter
    \colorlet{primary-text-color}{black}
}{ % Less bright
  \colorlet{primary-text-color}{white}
}

Responder2

Eu só precisava de um recurso semelhante. Esta solução requerPGF

\newcommand{\setcolor}[3]{%
  \definecolor{#1}{HTML}{#3}%
  \extractcolorspecs{#1}{\modelspec}{\grayscale}%
  \pgfmathparse{(
    array({\grayscale},0)*0.2126+
    array({\grayscale},1)*0.7152+
    array({\grayscale},2)*0.0722)>=0.5?int(1):int(0)}%
  \ifnum\pgfmathresult>0%
    \colorlet{#2}{black}%
    \else%
    \colorlet{#2}{white}%
  \fi%
}%

Você pode ligar com:

\setcolor{my-background-color}{my-foreground-color}{377EB8}

Funciona apenas com definição de cores HTML, mas acho que isso pode ser facilmente estendido.

Espero que ajude

informação relacionada