Спираючись на мою відповідь на подібне запитання .
Вам потрібно розбити шістнадцятковий код на 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. Якщо ви вважаєте, що результати вам не сподобалися, спробуйте більш просту формулу вище.