Я столкнулся с подобной проблемой. Мне пришлось найти хороший метод выбора цвета контрастного шрифта для отображения текстовых меток на цветовых шкалах / тепловых картах. Это должен был быть универсальный метод, а генерируемый цвет должен был быть «хорошо выглядящим», а это значит, что простое генерирование дополнительного цвета не было хорошим решением - иногда оно генерировало странные, очень интенсивные цвета, которые было трудно смотреть и читать.
После долгих часов тестирования и попыток решить эту проблему, я обнаружил, что лучшим решением является выбор белого шрифта для «темных» цветов и черного шрифта для «ярких» цветов.
Вот пример функции, которую я использую в 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);
}
Это было проверено для многих различных цветовых шкал (радуга, оттенки серого, жара, лед и многие другие) и является единственным «универсальным» методом, который я обнаружил.
Изменить
Изменена формула подсчета a
на «воспринимаемую яркость» - она действительно выглядит лучше! Уже реализовал это в моем программном обеспечении, выглядит великолепно.
Edit 2
@WebSeed предоставил отличный рабочий пример этого алгоритма: http://codepen.io/WebSeed/full/pvgqEq/