Мне нужно определить, является ли выбранный UIColor (выбранный пользователем) темным или ярким, чтобы я мог изменить цвет строки текста, расположенной поверх этого цвета, для лучшей читаемости.
Вот пример во Flash / Actionscript (с демонстрацией): http://web.archive.org/web/20100102024448/http://theflashblog.com/?p=173
Есть предположения?
Привет, Андре
ОБНОВИТЬ
Благодаря всем предложениям вот рабочий код:
- (void) updateColor:(UIColor *) newColor
{
const CGFloat *componentColors = CGColorGetComponents(newColor.CGColor);
CGFloat colorBrightness = ((componentColors[0] * 299) + (componentColors[1] * 587) + (componentColors[2] * 114)) / 1000;
if (colorBrightness < 0.5)
{
NSLog(@"my color is dark");
}
else
{
NSLog(@"my color is light");
}
}
Еще раз спасибо :)
Ответы:
W3C имеет следующее: http://www.w3.org/WAI/ER/WD-AERT/#color-contrast
Если вы делаете только черный или белый текст, используйте расчет яркости цвета выше. Если ниже 125, используйте белый текст. Если 125 или больше, используйте черный текст.
редактировать 1: предвзятое отношение к черному тексту. :)
редактировать 2: Используемая формула: ((Красное значение * 299) + (Зеленое значение * 587) + (Синее значение * 114)) / 1000.
источник
NSArray *components = (NSArray *)CGColorGetComponents([UIColor CGColor]);
для получения массива компонентов цвета, включая альфа-канал. В документации не указано, в каком порядке они находятся, но я предполагаю, что это будет красный, зеленый, синий, альфа. Кроме того, из документации, «размер массива на единицу больше, чем количество компонентов цветового пространства для цвета». - не сказано, почему ...Вот расширение Swift (3) для выполнения этой проверки.
Это расширение работает с оттенками серого. Однако, если вы создаете все свои цвета с помощью инициализатора RGB и не используете встроенные цвета, такие как
UIColor.black
иUIColor.white
, возможно, вы можете удалить дополнительные проверки.Тесты:
Примечание: обновлено до Swift 3 07.12.18
источник
components[0]
. Вроде так:let componentColorX: CGFloat = components[1]
Используя ответ Эрика Недвидида, я придумал этот небольшой фрагмент кода для легкого включения.
источник
UIColor whiteColor, grayColor, blackColor
.Swift3
источник
Версия Swift 4
источник
Мое решение этой проблемы в категории (взято из других ответов здесь). Также работает с оттенками серого, чего на момент написания нет ни в одном другом ответе.
источник
Более простое расширение Swift 3:
источник
Если вы предпочитаете блочную версию:
источник
Для всего, что не является серым, инверсия цвета RGB обычно сильно контрастирует с ним. Демо просто инвертирует цвет и обесцвечивает его (преобразует его в серый).
Но создать приятную успокаивающую комбинацию цветов довольно сложно. Смотреть на :
http://particletree.com/notebook/calculating-color-contrast-for-legible-text/
источник
Следующий метод - найти светлый или темный цвет на языке Swift на основе белого цвета.
Следующий метод - найти светлый или темный цвет в Swift с использованием компонентов цвета.
источник
Для меня использование только CGColorGetComponents не сработало, я получил 2 компонента для UIColors, таких как белый. Поэтому сначала мне нужно проверить модель цветового пространства. Это то, что я придумал, что в итоге стало быстрой версией ответа @mattsven.
Цветовое пространство взято отсюда: https://stackoverflow.com/a/16981916/4905076
источник
UIColor имеет следующий метод преобразования в цветовое пространство HSB :
источник
Добавленная
Swift 5
версия:источник
UIColor
это цвет в оттенках серого. Случайный цвет RGB не будет работать с этим кодом.Если вы хотите узнать яркость цвета, вот какой-то псевдокод:
Если он> 0,5, он яркий, в противном случае - темный.
источник