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 を使って色を取得した方が何かと便利なような気もします。
[ もどる ]