Опираясь на мой ответ на аналогичный вопрос .
Вам нужно разбить шестнадцатеричный код на 3 части, чтобы получить индивидуальные интенсивности красного, зеленого и синего. Каждые 2 цифры кода представляют значение в шестнадцатеричной (основа-16) записи. Я не буду вдаваться в подробности преобразования здесь, их легко найти.
Если у вас есть интенсивности для отдельных цветов, вы можете определить общую интенсивность цвета и выбрать соответствующий текст.
if (red*0.299 + green*0.587 + blue*0.114) > 186 use #000000 else use #ffffff
Порог 186 основан на теории, но может быть скорректирован по вкусу. Исходя из комментариев ниже порога 150 может работать лучше для вас.
Изменить: Выше, просто и работает достаточно хорошо, и, кажется, здесь хорошо, в StackOverflow. Тем не менее, один из комментариев ниже показывает, что в некоторых случаях это может привести к несоблюдению рекомендаций W3C. При этом я получаю модифицированную форму, которая всегда выбирает самый высокий контраст на основе руководящих принципов. Если вам
не нужно соответствовать правилам W3C, я бы придерживался более простой формулы, приведенной выше.
Формула, приведенная для контраста в Рекомендациях W3C, - это (L1 + 0.05) / (L2 + 0.05)
где L1
яркость самого светлого цвета и L2
яркость самого темного по шкале 0,0-1,0. Яркость черного цвета равна 0,0, а белого - 1,0, поэтому подстановка этих значений позволяет определить значение с самым высоким контрастом. Если контраст для черного больше, чем для белого, используйте черный, в противном случае используйте белый. Учитывая яркость цвета, который вы тестируете во L
время теста:
if (L + 0.05) / (0.0 + 0.05) > (1.0 + 0.05) / (L + 0.05) use #000000 else use #ffffff
Это упрощает алгебраически до:
if L > sqrt(1.05 * 0.05) - 0.05
Или примерно:
if L > 0.179 use #000000 else use #ffffff
Осталось только вычислить L
. Эта формула также приводится в руководствах и выглядит как преобразование из sRGB в линейный RGB, за которым следует рекомендация МСЭ-R BT.709 для яркости.
for each c in r,g,b:
c = c / 255.0
if c <= 0.03928 then c = c/12.92 else c = ((c+0.055)/1.055) ^ 2.4
L = 0.2126 * r + 0.7152 * g + 0.0722 * b
Порог 0,179 не должен изменяться, поскольку он привязан к рекомендациям W3C. Если вы находите результаты не по вкусу, попробуйте более простую формулу выше.