Проверьте, является ли UIColor темным или светлым? - PullRequest
97 голосов
/ 24 марта 2010

Мне нужно определить, является ли выбранный UIColor (выбранный пользователем) темным или светлым, чтобы я мог изменить цвет строки текста, расположенной поверх этого цвета, для лучшей читаемости.

Вот пример во Flash / Actionscript (с демонстрацией): http://web.archive.org/web/20100102024448/http://theflashblog.com/?p=173

Есть мысли?

Ура, Andre

UPDATE

Спасибо всем за предложения, вот рабочий код:

- (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");
    }
}

Еще раз спасибо:)

Ответы [ 15 ]

2 голосов
/ 29 июля 2015

Следующий метод - найти цвет светлый или темный в языке Swift на основе белого цвета.

func isLightColor(color: UIColor) -> Bool 
{
   var white: CGFloat = 0.0
   color.getWhite(&white, alpha: nil)

   var isLight = false

   if white >= 0.5
   {
       isLight = true
       NSLog("color is light: %f", white)
   }
   else
   {
      NSLog("Color is dark: %f", white)
   }

   return isLight
}

Следующий метод - найти цвет светлый или темный в Swift с использованием цветовых компонентов.

func isLightColor(color: UIColor) -> Bool 
{
     var isLight = false

     var componentColors = CGColorGetComponents(color.CGColor)

     var colorBrightness: CGFloat = ((componentColors[0] * 299) + (componentColors[1] * 587) + (componentColors[2] * 114)) / 1000;
     if (colorBrightness >= 0.5)
     {
        isLight = true
        NSLog("my color is light")
     }
     else
     {
        NSLog("my color is dark")
     }  
     return isLight
}
2 голосов
/ 24 марта 2010

Для всего, что не серовато, RGB-инверсия цвета обычно сильно контрастирует с ним. Демо просто инвертирует цвет и обесцвечивает его (превращает в серый).

Но создать приятную успокаивающую комбинацию цветов довольно сложно. Посмотрите на:

http://particletree.com/notebook/calculating-color-contrast-for-legible-text/

0 голосов
/ 31 января 2017

Использование HandyUIKit делает это легкой задачей , например:

import HandyUIKit    

UIColor.black.hlca.luminance     // => 0.0
UIColor.white.hlca.luminance     // => 1.0
UIColor.lightGray.hlca.luminance // => 0.70
UIColor.darkGray.hlca.luminance  // => 0.36
UIColor.red.hlca.luminance       // => 0.53
UIColor.green.hlca.luminance     // => 0.87
UIColor.blue.hlca.luminance      // => 0.32

Простое использование .hlca.luminance на любом экземпляре UIColor даст вам правильное значение для воспринимаемой легкости . В большинстве других подходов не учитывается тот факт, что люди воспринимают разные цвета (даже если насыщенность и яркость одинаковы) при разных уровнях яркости . Значения luminance учитывают это.

Прочитайте этот отличный пост в блоге или запись в Википедии о LAB цветовом пространстве для дальнейшего объяснения. Они также объяснят, почему цветовая система HSB с ее значением brightness составляет всего половину решения.

Как подсказка: обратите внимание, что значение luminance цвета pure green на намного выше , чем на pure blue . Это просто потому, что люди воспринимают чистый синий как гораздо более темный цвет, чем чистый зеленый.

0 голосов
/ 04 июля 2014
- (BOOL)isColorLight:(UIColor*)color
{
    CGFloat white = 0;
    [color getWhite:&white alpha:nil];
    return (white >= .5);
}
0 голосов
/ 24 марта 2010

Если вы хотите найти яркость цвета, вот некоторый псевдокод:

public float GetBrightness(int red, int blue, int green)
{
    float num = red / 255f;
    float num2 = blue / 255f;
    float num3 = green / 255f;
    float num4 = num;
    float num5 = num;
    if (num2 > num4)
        num4 = num2;
    if (num3 > num4)
        num4 = num3;
    if (num2 < num5)
        num5 = num2;
    if (num3 < num5)
        num5 = num3;
    return ((num4 + num5) / 2f);
}

Если оно> 0,5, оно светлое, а в остальном темное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...