Я зіткнувся з подібною проблемою. Мені довелося знайти хороший метод вибору контрастного кольору шрифту для відображення текстових міток на кольорових шкалах / теплових картах. Це повинен був бути універсальним методом, і генерований колір повинен бути "добре виглядає", а це означає, що простий генеруючий додатковий колір не був гарним рішенням - іноді він створював дивні, дуже інтенсивні кольори, які важко було спостерігати і читати.
Після довгих годин тестування та спроб вирішити цю проблему я з’ясував, що найкращим рішенням є вибір білого шрифту для «темних» кольорів, а чорний шрифт для «яскравих» кольорів.
Ось приклад функції, яку я використовую в 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/