Как я могу получить оттенок, насыщенность и яркость от UIColor? - PullRequest
2 голосов
/ 12 марта 2011

Я хочу получить индивидуальные значения из UIColor. Не знаете, как это сделать?

Ответы [ 3 ]

8 голосов
/ 24 июля 2011
static void RGBtoHSV( float r, float g, float b, float *h, float *s, float *v )
{
    float min, max, delta;
    min = MIN( r, MIN( g, b ));
    max = MAX( r, MAX( g, b ));
    *v = max;               // v
    delta = max - min;
    if( max != 0 )
        *s = delta / max;       // s
    else {
        // r = g = b = 0        // s = 0, v is undefined
        *s = 0;
        *h = -1;
        return;
    }
    if( r == max )
        *h = ( g - b ) / delta;     // between yellow & magenta
    else if( g == max )
        *h = 2 + ( b - r ) / delta; // between cyan & yellow
    else
        *h = 4 + ( r - g ) / delta; // between magenta & cyan
    *h *= 60;               // degrees
    if( *h < 0 )
        *h += 360;
}

static void HSVtoRGB( float *r, float *g, float *b, float h, float s, float v )
{
    int i;
    float f, p, q, t;
    if( s == 0 ) {
        // achromatic (grey)
        *r = *g = *b = v;
        return;
    }
    h /= 60;            // sector 0 to 5
    i = floor( h );
    f = h - i;          // factorial part of h
    p = v * ( 1 - s );
    q = v * ( 1 - s * f );
    t = v * ( 1 - s * ( 1 - f ) );
    switch( i ) {
        case 0:
            *r = v;
            *g = t;
            *b = p;
            break;
        case 1:
            *r = q;
            *g = v;
            *b = p;
            break;
        case 2:
            *r = p;
            *g = v;
            *b = t;
            break;
        case 3:
            *r = p;
            *g = q;
            *b = v;
            break;
        case 4:
            *r = t;
            *g = p;
            *b = v;
            break;
        default:        // case 5:
            *r = v;
            *g = p;
            *b = q;
            break;
    }
}

...

CGFloat r, g, b, a, h, s, v;

const CGFloat *comp = CGColorGetComponents([myUIColor CGColor]);

r = comp[0];
g = comp[1];
b = comp[2];
a = comp[3];

RGBtoHSV(r, g, b, &h, &s, &v);

Приведенный выше код предполагает, что UIColor настроен в пространстве RGB (что типично).Если цвет находится в другом цветовом пространстве, он потерпит крах и / или будет иметь неопределенное поведение.

В iOS 5.0 есть - (BOOL)getHue:(CGFloat *)hue saturation:(CGFloat *)saturation brightness:(CGFloat *)brightness alpha:(CGFloat *)alpha, который выполняет всю эту работу за вас.Но это еще не доступно.

1 голос
/ 10 февраля 2013

В нижней части алгоритма Дастина он упоминает все объекты UIColor в iOS 5 и более поздние версии теперь имеют

getHue:saturation:brightness:alpha:

. Это позволяет очень легко получить значения из цвета.Это, безусловно, самое простое решение сейчас, и большинство пользователей используют iOS 5.

1 голос
/ 13 марта 2011

В образце кода GLPaint от Apple есть функция с именем HSL2RGB () , которая будет делать то, что вы хотите. Комментарий над функцией указывает на Википедию для объяснения кода, который может помочь вам понять, что происходит.

...