Я столкнулся с подобной проблемой. Мне пришлось найти хороший метод выбора цвета контрастного шрифта для отображения текстовых меток на цветовых шкалах / тепловых картах. Это должен был быть универсальный метод, а генерируемый цвет должен был быть «хорошо выглядящим», а это значит, что простое генерирование дополнительного цвета не было хорошим решением - иногда оно генерировало странные, очень интенсивные цвета, которые было трудно смотреть и читать.
После долгих часов тестирования и попыток решить эту проблему, я обнаружил, что лучшим решением является выбор белого шрифта для «темных» цветов и черного шрифта для «ярких» цветов.
Вот пример функции, которую я использую в 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/
На тот случай, если кому-то понравится более короткая, возможно, более понятная версия ответа GaceK :
Примечание: я убрал инверсию значения яркости (чтобы яркие цвета имели более высокое значение, что мне кажется более естественным, а также метод расчета по умолчанию).
Я использовал те же константы , как Гашек из здесь , так как они работали отлично подходит для меня.
(Вы также можете реализовать это как метод расширения, используя следующую подпись:
Вы можете позвонить через
foregroundColor = background.ContrastColor()
.)источник
Спасибо @Gacek . Вот версия для Android:
И улучшенная (более короткая) версия:
источник
1 - ...
части и переименуйтеa
вluminance
Моя быстрая реализация ответа Гацека:
источник
Javascript [ES2015]
источник
Спасибо за этот пост.
Для тех, кто может быть заинтересован, вот пример этой функции в Delphi:
источник
Это такой полезный ответ. Спасибо за это!
Я хотел бы поделиться версией SCSS:
Теперь выясним, как использовать алгоритм для автоматического создания парящих цветов для ссылок меню. Светлые заголовки становятся более темными, и наоборот.
источник
Реализация флаттера
источник
Гадкий Питон, если тебе не хочется его писать :)
источник
У меня была такая же проблема, но я должен был разработать ее на PHP . Я использовал решение @ Garek, и я также использовал этот ответ: конвертировать шестнадцатеричный цвет в значения RGB в PHP, чтобы преобразовать код цвета HEX в RGB.
Так что я делюсь этим.
Я хотел использовать эту функцию с заданным фоновым цветом HEX, но не всегда начиная с '#'.
источник
Как расширение Kotlin / Android:
источник
Реализация для цели-с
источник
iOS Swift 3.0 (расширение UIColor):
источник
Swift 4 Пример:
ОБНОВЛЕНИЕ - Найдено, что это
0.6
был лучший тестовый стенд для запросаисточник
CGColor.components
варьируется в зависимости от цветового пространства: например,UIColor.white
при приведении к CGColor их всего два:[1.0, 1.0]
представление цвета в оттенках серого (полностью белого) с полной альфа-версией. Лучшее средство для извлечения элементов RGB из UIColorUIColor.getRed(_ red:, green:, blue:, alpha:)
Обратите внимание, что алгоритм для этого есть в библиотеке закрытия Google, которая ссылается на рекомендацию w3c: http://www.w3.org/TR/AERT#color-contrast . Однако в этом API вы предоставляете список предлагаемых цветов в качестве отправной точки.
источник
Если вы манипулируете цветовыми пространствами для визуального эффекта, обычно легче работать в HSL (Hue, Saturation and Lightness), чем в RGB. Перемещение цветов в RGB для получения естественно приятных эффектов, как правило, является довольно концептуально сложным, в то время как преобразование в HSL, манипулирование там, а затем обратное преобразование является более интуитивным в концепции и неизменно дает лучшие результаты.
В Википедии есть хорошее введение в HSL и тесно связанный HSV. И есть бесплатный код в сети, чтобы сделать преобразование (например, вот реализация javascript )
Какое точное преобразование вы используете - дело вкуса, но лично я бы подумал, что изменение компонентов Hue и Lightness наверняка приведет к хорошему высококонтрастному цвету в первом приближении, но вы можете легко получить более тонкие эффекты.
источник
Вы можете иметь любой текст оттенка на любом фоне оттенка и обеспечить его разборчивость. Я делаю это все время. Для этого в Javascript есть формула для удобочитаемого текста в цвете - STW *. Как сказано в этой ссылке, формула представляет собой вариацию в расчете регулировки обратной гаммы, хотя и немного более управляемая IMHO. Меню в правой части этой ссылки и связанных с ней страниц используют произвольно сгенерированные цвета для текста и фона, всегда читаемые. Так что да, ясно, что это можно сделать, нет проблем.
источник
Вариант Android, который также фиксирует альфу.
(спасибо @ Томас-Вос)
источник
base
R-версия ответа @ Gacek, чтобы получитьluminance
(вы можете легко применить свой собственный порог)Использование:
источник
Основываясь на ответе Гасека и проанализировав пример @ WebSeed с расширением браузера WAVE , я пришел к следующей версии, в которой черный или белый текст выбирается на основе коэффициента контрастности (как определено в Руководстве по доступности веб-контента W3C (WCAG) 2.1 ). вместо яркости.
Это код (в JavaScript):
Рабочий пример может быть найден в моей развилке codepen @ WebSeed, которая выдает нулевые ошибки низкой контрастности в WAVE.
источник