Pregunta

Dado un UIColor, necesito para determinar si es "light" o "oscuro". Si pudiera acceder el valor hexadecimal del color, tan sólo pudiera comprobar si era mayor o menor que un cierto número umbral hexagonal, pero no parece haber ninguna manera de hacerlo. ¿Esta ahí? O hay otra manera de que pudiera comprobar el valor de brillo de un UIColor?

¿Fue útil?

Solución

esta categoría para extender UIColor para saber HSV / HSB y compara [aUIColor brightness]

Editar:
Me encontré con el mismo código en algún proyecto github alojada , un hecho esencial de esto: 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

Otros consejos

[UIColor CGColor] le conseguirá una CGColorRef, desde allí se puede hacer CGColorGetComponents para obtener los componentes individuales. Obtener el valor de "brillo" depende de su definición de brillo. Conseguir un promedio de los componentes (en caso de espacio de color RGB) podría ser un comienzo bueno.

UIColor (y CGColorRef) se describen generalmente en valores RGB. Si desea determinar oscura luz o, es probable que desee convertir estos valores a algo así como Tono / Saturación / Luminosidad. Pero hay ninguna se construyen en funciones como usted está buscando.

aquí es una guía (con el código proporcionado) en la expansión UIColor (usando una categoría) y tiene métodos como get hexStringFromColor: Debe ser lo que estás buscando. UIColor expansión Nota: Hice no escribir este blog o código.

Algoritmo propuesto para calcular el color / color de la diferencia de brillo: http://maestric.com/doc/color_brightness_difference_calculator (Basado en papel W3C)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top