UIColor から RGB を取得する : Objective-C プログラミング

PROGRAM


UIColor から RGB を取得する

iOS 4 以前で RGB を取得する場合

UIColor が保持している RGBA の値を取得するには、iOS 5 よりも前であれば、CGColorGetComponents 関数を使用します。

この関数は、RGBA の 4 つの値をそれぞれ CGFloat 型で順に const CGFloat* 型の C 配列で返すのですけど、RGB の値が一緒の場合(たとえば白 [R=1.0, G=1.0, B=1.0] や黒 [R=0.0, G=0.0, B=0.0] の場合)には、それらがまとまれて、それらと A との 2 つだけが帰ってくるのが厄介です。

戻される配列の数は CGColorGetNumberOfComponents 関数で取得することができるようになっているので、それらを使って次のように RGBA の値を取得する感じになると思います。

CGFloat red;

CGFloat green;

CGFloat blue;

CGFloat alpha;

 

const CGFloat* rgba;

int rgbaCount;

 

// UIColor 型の color から RGBA の要素と要素数を取得します。

rgba = CGColorGetComponents(color.CGColor);

rgbaCount = CGColorGetNumberOfComponents(color.CGColor);

 

// 赤の要素は必ず 0 番目に格納されています。

red = rgba1[0];

 

// 緑の要素は、4 つの要素が得られた場合は 1 番目に、そうでなければ 0 番目に格納されています。

green = rgba[(rgbaCount == 4 ? 1 : 0)];

 

// 青の要素は、4 つの要素が得られた場合は 2 番目に、そうでなければ 0 番目に格納されています。

blue = rgba[(rgbaCount == 4 ? 2 : 0)];

 

// 透明度の要素は、4 つの要素が得られた場合は 4 番目に、そうでなければ 1 番目に格納されています。

alpha = rgba[(rgbaCount == 4 ? 3 : 1)];

このような感じで、UIColor から RGBA の値を取得するのは、少しばかり手間がかかる感じですね。

iOS 5 以上で RGB を取得する場合

iOS 5 からは、UIColor に RGBA の値を取得するメソッドが実装された様子です。

CGFloat red;

CGFloat green;

CGFloat blue;

CGFloat alpha;

 

// UIColor 型の color から RGBA の値を取得します。

[color getRed:&red green:&green blue:&blue alpha:&alpha];

このように、iOS 5 以上で動作すればいいアプリであれば、簡単に RGBA の値を取得することができるようになりました。

ただし、UIColor が内部で保持する色情報によっては、色の取得ができないことがあります。

たとえば UIColor の clearColor メソッドで取得した色や、colorWithWhite:alpha: メソッドで作成した色では取得できませんでした。逆に recColor メソッドや colorWithHue:saturation:brightness:alpha: メソッド、colorWithRed:green:blue:alpha: メソッドで作成した色では取得できました。

 

ちなみにこのメソッド、値を取得できなかった場合には NO を戻り値として返します。

その場合でも、冒頭で話した CGColorGetComponents を使う方法であれば色を取得できるようなので、基本的には CGColorGetComponents を使って色を取得した方が何かと便利なような気もします。

[ もどる ]