Я создаю пользовательскую тему для проектора и определил команду для установки цветов, используемых в презентации, например: \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, но я думаю, что его можно легко расширить.
Надеюсь, это поможет.