Utilice valores RGB de color para determinar un color de contraste

Utilice valores RGB de color para determinar un color de contraste

Estoy creando un tema de proyector personalizado y definí un comando para configurar los colores utilizados en la presentación de esta manera: \definecolor{primarycolor}{HTML}{9C27B0}(púrpura por cierto).
Digamos primarycolorque es mi color de fondo de un marco.

Ahora, quiero poder calcular el brillo/luminancia de un color determinado para determinar un color adecuado para el texto (ya sea blanco o negro). En el caso del morado, el blanco sería un color de texto legible.

Yo lo haría así (pseudocódigo):
luminance := 0.2126 * Red + 0.7152 * Green + 0.0722 * Blue
textcolor := luminance < 128 ? black : white

¿Cómo obtengo los valores RGB de un color y luego determino el "color de contraste" (blanco o negro)?

Respuesta1

Aquí está mi solución para determinar la luminosidad de un color y luego decidir un color de contraste (no está limpio pero 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}
}

Respuesta2

Solo necesitaba una característica similar. Esta solución requierePGF

\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%
}%

Puedes llamar con:

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

Sólo funciona con la definición de color HTML, pero creo que se puede ampliar fácilmente.

Espero que ayude

información relacionada