黒毛和牛モモバラ切り落し100g298円

iPhoneアプリを作ってます。リリースノートとかごにょごにょとか用ブログです。

UIColorインスタンスからRGBAの値を取得する

UIColorにはgetRed:green:blue:alpha:メソッドがあるのですが、このメソッドだとカラースペースがRGBAじゃない場合([UIColor whiteColor]とかが返す値はWAカラースペースになる)RGBAを取れなかったのでその辺をうまいことしてゴニョっと返してくれる関数を書いてみました。他にも処理すべきカラースペースがあるのかもしれませんので、ちゃんと変換してくれないようなら調べてください。

BOOL
colorToRGBA(UIColor *color, CGFloat *r, CGFloat *g, CGFloat *b, CGFloat *a)
{
    if ([color getRed:r green:g blue:b alpha:a]) {
        return YES;
    }
    
    CGFloat h;
    CGFloat s;
    CGFloat v;
    if ([color getHue:&h saturation:&s brightness:&v alpha:a]) {
        int inn = floorf(h / 60.0f);
        if (inn < 0) {
            inn *= -1;
        }
        
        CGFloat fl = (h  / 60.0f) - inn;
        CGFloat p = v * (1 - s);
        CGFloat q = v * (1 - s * fl);
        CGFloat t = v * (1 - (1 - fl) * s);
        
        switch( inn )
        {
            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 = q;
                break;
            case 3:
                *r = p;
                *g = q;
                *b = v;
                break;
            case 4:
                *r = t;
                *g = p;
                *b = v;
                break;
            case 5:
                *r = v;
                *g = p;
                *b = q;
                break;
        }
        
        return YES;
    }
    
    if (CGColorGetNumberOfComponents(color.CGColor) == 2) {
        const float *components = CGColorGetComponents(color.CGColor);
        *r = components[0];
        *g = components[0];
        *b = components[0];
        *a = components[1];
    }
    
    return NO;
}