How do i get the hue, saturation and brightness from a UIColor?

后端 未结 3 1500
挽巷
挽巷 2021-01-14 21:56

I want to get the individual values from a UIColor. Unsure how to do it?

相关标签:
3条回答
  • 2021-01-14 22:10

    At the bottom of Dustin's algorithm, he mentions all UIColor objects in iOS 5 and later now have

    getHue:saturation:brightness:alpha:
    

    This makes it very easy to get the values from a color. This is definitely the easiest solution now, and most everyone is on iOS 5.

    0 讨论(0)
  • There's a function called HSL2RGB() in the GLPaint sample code from Apple that'll do what you want. A comment above the function points you to Wikipedia for an explanation of the code, which may help you understand what's going on.

    0 讨论(0)
  • 2021-01-14 22:22
    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);
    

    The code above assumes the UIColor is setup in the RGB space (which is typical). If the color is in another color space it will crash and / or have undefined behavior.

    iOS 5.0 has - (BOOL)getHue:(CGFloat *)hue saturation:(CGFloat *)saturation brightness:(CGFloat *)brightness alpha:(CGFloat *)alpha which does all this work for you. But it's not available yet.

    0 讨论(0)
提交回复
热议问题