Опираясь на мой ответ на аналогичный вопрос .
Вам нужно разбить шестнадцатеричный код на 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, за которым следует рекомендация ITU-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.Если вам не нравятся результаты, попробуйте более простую формулу, приведенную выше.