Basandomi sulla mia risposta a una domanda simile .
Devi dividere il codice esadecimale in 3 pezzi per ottenere le singole intensità rosse, verdi e blu. Ogni 2 cifre del codice rappresentano un valore in notazione esadecimale (base-16). Non entrerò nei dettagli della conversione qui, sono facili da consultare.
Una volta che hai le intensità per i singoli colori, puoi determinare l'intensità complessiva del colore e scegliere il testo corrispondente.
if (red*0.299 + green*0.587 + blue*0.114) > 186 use #000000 else use #ffffff
La soglia di 186 si basa sulla teoria, ma può essere regolata a piacere. Sulla base dei commenti al di sotto di una soglia di 150 potrebbe funzionare meglio per te.
Modifica: quanto sopra è semplice e funziona abbastanza bene, e sembra avere una buona accettazione qui su StackOverflow. Tuttavia, uno dei commenti seguenti mostra che in alcune circostanze può portare alla non conformità alle linee guida del W3C. Con la presente ne ricavo una forma modificata che sceglie sempre il massimo contrasto sulla base delle linee guida. Se
non è necessario conformarsi alle regole del W3C, attenersi alla formula più semplice sopra.
La formula indicata per il contrasto nelle raccomandazioni del W3C è (L1 + 0.05) / (L2 + 0.05)
, dove L1
è la luminanza del colore più chiaro ed L2
è la luminanza del più scuro su una scala di 0,0-1,0. La luminanza del nero è 0,0 e il bianco è 1,0, quindi sostituendo questi valori è possibile determinare quello con il contrasto più elevato. Se il contrasto per il nero è maggiore del contrasto per il bianco, utilizzare il nero, altrimenti utilizzare il bianco. Data la luminanza del colore che stai testando quando L
il test diventa:
if (L + 0.05) / (0.0 + 0.05) > (1.0 + 0.05) / (L + 0.05) use #000000 else use #ffffff
Questo semplifica algebricamente:
if L > sqrt(1.05 * 0.05) - 0.05
O approssimativamente:
if L > 0.179 use #000000 else use #ffffff
L'unica cosa rimasta è calcolare L
. Tale formula è anche indicata nelle linee guida e sembra la conversione da RGB RGB a RGB lineare seguita dalla raccomandazione ITU-R BT.709 per la luminanza.
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
La soglia di 0,179 non deve essere modificata poiché è legata alle linee guida del W3C. Se trovi che i risultati non ti piacciono, prova la formula più semplice sopra.