Ho riscontrato un problema simile. Ho dovuto trovare un buon metodo per selezionare il colore del carattere contrastivo per visualizzare etichette di testo su scale colori/mappe di calore. Doveva essere un metodo universale e il colore generato doveva essere "bello", il che significa che la semplice generazione di colori complementari non era una buona soluzione - a volte generava colori strani e molto intensi che erano difficili da guardare e leggere.
Dopo lunghe ore di test e cercando di risolvere questo problema, ho scoperto che la soluzione migliore è selezionare il carattere bianco per i colori "scuri" e il carattere nero per i colori "luminosi".
Ecco un esempio della funzione sto utilizzando in C#:
Color ContrastColor(Color color)
{
int d = 0;
// Counting the perceptive luminance - human eye favors green color...
double a = 1 - (0.299 * color.R + 0.587 * color.G + 0.114 * color.B)/255;
if (a < 0.5)
d = 0; // bright colors - black font
else
d = 255; // dark colors - white font
return Color.FromArgb(d, d, d);
}
Questo è stato testato per molti vari colorscales (arcobaleno, in scala di grigi, calore, ghiaccio, e molti altri) ed è l'unico metodo di "universale" Ho scoperto.
Modifica
cambiato la formula di contare a
a "luminanza percettiva" - è davvero un aspetto migliore! Già implementato nel mio software, sembra fantastico.
Edit 2 @WebSeed fornito un grande esempio di lavoro di questo algoritmo: http://codepen.io/WebSeed/full/pvgqEq/
Probabilmente non è importante, ma si potrebbe desiderare un migliore funzione per calcolare la luminosità http: // StackOverflow.it/questions/596216/formula-per-determinare-luminosità-di-colore-rgb –
Sembra che sarà perfetto. –
Migliorato il codice - ora è ancora meglio – Gacek