Используйте значения цвета RGB для определения контрастного цвета.

Используйте значения цвета RGB для определения контрастного цвета.

Я создаю пользовательскую тему для проектора и определил команду для установки цветов, используемых в презентации, например: \definecolor{primarycolor}{HTML}{9C27B0}(кстати, фиолетовый).
Допустим, primarycolorэто мой фоновый цвет кадра.

Теперь я хочу иметь возможность вычислять яркость/яркость заданного цвета, чтобы определить подходящий цвет для текста (черный или белый). В случае фиолетового, белый будет читаемым цветом текста.

Я бы сделал это так (псевдокод):
luminance := 0.2126 * Red + 0.7152 * Green + 0.0722 * Blue
textcolor := luminance < 128 ? black : white

Как получить значения RGB цвета, а затем определить «контрастный цвет» (черный или белый)?

решение1

Вот мое решение для определения яркости цвета, а затем выбора контрастного цвета (оно не совсем точное, но работает):

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

решение2

Мне просто нужна была похожая функция. Это решение требуетPGF

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

Вы можете позвонить с помощью:

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

Он работает только с определением цвета HTML, но я думаю, что его можно легко расширить.

Надеюсь, это поможет.

Связанный контент