Sobre la base de mi respuesta a una pregunta similar .
Debe dividir el código hexadecimal en 3 partes para obtener las intensidades individuales de rojo, verde y azul. Cada 2 dígitos del código representan un valor en notación hexadecimal (base-16). No entraré en los detalles de la conversión aquí, son fáciles de buscar.
Una vez que tenga las intensidades para los colores individuales, puede determinar la intensidad general del color y elegir el texto correspondiente.
if (red*0.299 + green*0.587 + blue*0.114) > 186 use #000000 else use #ffffff
El umbral de 186 se basa en la teoría, pero se puede ajustar al gusto. Según los comentarios a continuación, un umbral de 150 puede funcionar mejor para usted.
Editar: lo anterior es simple y funciona razonablemente bien, y parece tener buena aceptación aquí en StackOverflow. Sin embargo, uno de los comentarios a continuación muestra que puede dar lugar al incumplimiento de las directrices del W3C en algunas circunstancias. Con esto obtengo una forma modificada que siempre elige el mayor contraste basado en las pautas. Si
no necesita cumplir con las reglas del W3C, me quedaría con la fórmula más simple anterior.
La fórmula dada para el contraste en las Recomendaciones del W3C es (L1 + 0.05) / (L2 + 0.05)
, donde L1
está la luminancia del color más claro y L2
es la luminancia del más oscuro en una escala de 0.0-1.0. La luminancia del negro es 0.0 y el blanco es 1.0, por lo que sustituir esos valores le permite determinar el que tenga el mayor contraste. Si el contraste para el negro es mayor que el contraste para el blanco, use negro, de lo contrario use blanco. Dada la luminosidad del color que está probando a medida que L
la prueba se convierte en:
if (L + 0.05) / (0.0 + 0.05) > (1.0 + 0.05) / (L + 0.05) use #000000 else use #ffffff
Esto se simplifica algebraicamente para:
if L > sqrt(1.05 * 0.05) - 0.05
O aproximadamente:
if L > 0.179 use #000000 else use #ffffff
Lo único que queda es calcular L
. Esa fórmula también se proporciona en las pautas y parece la conversión de sRGB a RGB lineal seguido de la recomendación ITU-R BT.709 para luminancia.
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
El umbral de 0.179 no debe cambiarse ya que está vinculado a las pautas del W3C. Si encuentra que los resultados no son de su agrado, intente con la fórmula más simple de arriba.