Napotkałem podobny problem. Musiałem znaleźć dobrą metodę wyboru kontrastowego koloru czcionki, aby wyświetlać etykiety tekstowe na skalach kolorów / mapach cieplnych. Musiała to być metoda uniwersalna, a generowany kolor musiał być „dobrze wyglądający”, co oznacza, że proste generowanie komplementarnego koloru nie było dobrym rozwiązaniem - czasami generowało dziwne, bardzo intensywne kolory, które były trudne do oglądania i czytania.
Po długich godzinach testowania i próbach rozwiązania tego problemu odkryłem, że najlepszym rozwiązaniem jest wybranie białej czcionki dla „ciemnych” kolorów i czarnej czcionki dla „jasnych” kolorów.
Oto przykład funkcji używam w C #:
Color ContrastColor(Color color)
{
int d = 0;
// Counting the perceptive luminance - human eye favors green color...
double luminance = ( 0.299 * color.R + 0.587 * color.G + 0.114 * color.B)/255;
if (luminance > 0.5)
d = 0; // bright colors - black font
else
d = 255; // dark colors - white font
return Color.FromArgb(d, d, d);
}
Zostało to przetestowane na wiele różnych skal kolorów (tęcza, skala szarości, ciepło, lód i wiele innych) i jest to jedyna „uniwersalna” metoda, jaką odkryłem.
Edytuj
Zmieniono formułę liczeniaa
na „spostrzegawczą luminancję” - naprawdę wygląda lepiej! Już zaimplementowane w moim oprogramowaniu, wygląda świetnie.
Edycja 2
@WebSeed stanowi świetny działający przykład tego algorytmu: http://codepen.io/WebSeed/full/pvgqEq/