UIColor сравнение - PullRequest
       10

UIColor сравнение

3 голосов
/ 02 сентября 2010

Учитывая UIColor, мне нужно определить, является ли он "светлым" или "темным". Если бы я мог получить доступ к шестнадцатеричному значению цвета, я мог бы просто проверить, было ли оно больше или меньше определенного порогового шестнадцатеричного числа, но, похоже, нет способа сделать это. Есть? Или есть другой способ проверить яркость UIColor?

Ответы [ 5 ]

3 голосов
/ 02 сентября 2010

Вы можете установить эту категорию для расширения UIColor для знания HSV / HSB и сравнить [aUIColor brightness]

Edit:
Я нашел тот же код в каком-то проекте, размещенном на github , суть в этом: https://gist.github.com/1252197


#import "UIColor-HSVAdditions.h"

@implementation UIColor (UIColor_HSVAdditions)
+(struct hsv_color)HSVfromRGB:(struct rgb_color)rgb
{
    struct hsv_color hsv;

    CGFloat rgb_min, rgb_max;
    rgb_min = MIN3(rgb.r, rgb.g, rgb.b);
    rgb_max = MAX3(rgb.r, rgb.g, rgb.b);

    hsv.val = rgb_max;
    if (hsv.val == 0) {
        hsv.hue = hsv.sat = 0;
        return hsv;
    }

    rgb.r /= hsv.val;
    rgb.g /= hsv.val;
    rgb.b /= hsv.val;
    rgb_min = MIN3(rgb.r, rgb.g, rgb.b);
    rgb_max = MAX3(rgb.r, rgb.g, rgb.b);

    hsv.sat = rgb_max - rgb_min;
    if (hsv.sat == 0) {
        hsv.hue = 0;
        return hsv;
    }

    if (rgb_max == rgb.r) {
        hsv.hue = 0.0 + 60.0*(rgb.g - rgb.b);
        if (hsv.hue < 0.0) {
            hsv.hue += 360.0;
        }
    } else if (rgb_max == rgb.g) {
        hsv.hue = 120.0 + 60.0*(rgb.b - rgb.r);
    } else /* rgb_max == rgb.b */ {
        hsv.hue = 240.0 + 60.0*(rgb.r - rgb.g);
    }

    return hsv;
}
-(CGFloat)hue
{
    struct hsv_color hsv;
    struct rgb_color rgb;
    rgb.r = [self red];
    rgb.g = [self green];
    rgb.b = [self blue];
    hsv = [UIColor HSVfromRGB: rgb];
    return (hsv.hue / 360.0);
}
-(CGFloat)saturation
{
    struct hsv_color hsv;
    struct rgb_color rgb;
    rgb.r = [self red];
    rgb.g = [self green];
    rgb.b = [self blue];
    hsv = [UIColor HSVfromRGB: rgb];
    return hsv.sat;
}
-(CGFloat)brightness
{
    struct hsv_color hsv;
    struct rgb_color rgb;
    rgb.r = [self red];
    rgb.g = [self green];
    rgb.b = [self blue];
    hsv = [UIColor HSVfromRGB: rgb];
    return hsv.val;
}
-(CGFloat)value
{
    return [self brightness];
}
@end
2 голосов
/ 02 сентября 2010

[UIColor CGColor] даст вам CGColorRef, оттуда вы можете сделать CGColorGetComponents , чтобы получить отдельные компоненты. Получение значения «яркость» зависит от вашего определения яркости. Получение среднего из компонентов (в случае цветового пространства RGB) может быть хорошим началом.

0 голосов
/ 02 сентября 2010

Предлагаемый алгоритм для расчета цвета / разницы яркости цвета: http://maestric.com/doc/color_brightness_difference_calculator (на основе бумаги w3c)

0 голосов
/ 02 сентября 2010

вот руководство (с предоставленным кодом) по расширению UIColor (с использованием категории) и содержит такие методы, как get hexStringFromColor: это должно быть то, что вы ищете. Расширение UIColor Примечание: я не писал этот блог или код.

0 голосов
/ 02 сентября 2010

UIColor (и CGColorRef) обычно описываются в значениях RGB.Если вы хотите определить светлое или темное, вы, вероятно, захотите преобразовать эти значения во что-то вроде Hue / Saturation / Brightness.Но нет встроенных функций, которые вы ищете.

...