Com base na minha resposta a uma pergunta semelhante .
Você precisa dividir o código hexadecimal em três partes para obter as intensidades individuais de vermelho, verde e azul. Cada 2 dígitos do código representa um valor em notação hexadecimal (base 16). Não vou entrar em detalhes da conversão aqui, eles são fáceis de procurar.
Depois de ter as intensidades para as cores individuais, você pode determinar a intensidade geral da cor e escolher o texto correspondente.
if (red*0.299 + green*0.587 + blue*0.114) > 186 use #000000 else use #ffffff
O limite de 186 é baseado na teoria, mas pode ser ajustado ao gosto. Com base nos comentários abaixo, um limite de 150 pode funcionar melhor para você.
Edit: O acima é simples e funciona razoavelmente bem, e parece ter uma boa aceitação aqui no StackOverflow. No entanto, um dos comentários abaixo mostra que isso pode levar ao não cumprimento das diretrizes do W3C em algumas circunstâncias. Com isso, derivo uma forma modificada que sempre escolhe o maior contraste com base nas diretrizes. Se você
não precisa estar em conformidade com as regras do W3C, eu continuaria com a fórmula mais simples acima.
A fórmula dada para contraste nas Recomendações do W3C é (L1 + 0.05) / (L2 + 0.05)
: onde L1
está a luminância da cor mais clara e L2
é a luminância da mais escura em uma escala de 0,0-1,0. A luminância do preto é 0,0 e o branco é 1,0, portanto, a substituição desses valores permite determinar o que tem maior contraste. Se o contraste para preto for maior que o contraste para branco, use preto; caso contrário, use branco. Dada a luminosidade da cor que você está testando à medida que L
o teste se torna:
if (L + 0.05) / (0.0 + 0.05) > (1.0 + 0.05) / (L + 0.05) use #000000 else use #ffffff
Isso simplifica algebricamente:
if L > sqrt(1.05 * 0.05) - 0.05
Ou aproximadamente:
if L > 0.179 use #000000 else use #ffffff
A única coisa que resta é calcular L
. Essa fórmula também é fornecida nas diretrizes e parece com a conversão de sRGB em RGB linear seguida pela recomendação ITU-R BT.709 para luminância.
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
O limite de 0,179 não deve ser alterado, pois está vinculado às diretrizes do W3C. Se você achar que os resultados não são do seu agrado, tente a fórmula mais simples acima.