色の勉強と色情報の取得

Pocket
LINEで送る

「ジオラマカメラ」作成にあたり、今回は色の勉強です。
今回もまずは用語からです。

色を表す用語

RGB:コンピューターで赤・緑・青の3色の組み合わせで色を表現する値です。印刷物の場合はCMYK(シアン・マゼンタ・イエロー・ブラック)の組み合わせで表現します。
色深度:1ピクセルで表現できる色数のこと。「色の深さ」として表記されることもあり、ビットやbpp(bit per pixel)という単位で表記します。
ハイカラー(high color):16bpp(16ビット)で65,536色を表現できる。(RGBの各要素は5bit,6bit,5bitとなる)
フルカラー(full color):24bpp(24ビット)で16,777,216色を表現できる。(RGBの各要素は8bit,8bit,8bitとなる)
トゥルーカラー(true color):32bpp(32ビット)で16,777,216色+透明度256階調を表現できる。(RGBの各要素は8bitずつ、さらに透明度として8bitを利用)

Androidによる色情報の取得

画像からのピクセルの読み込みは画像の勉強とプログラムによる読み込みで既に行っているので省略します。
実際にピクセルデータを取得したところから説明します。

int pix = bmp.getPixel(x, y);
byte alpha = (byte)((pix  & 0xFF000000) >> 24);
byte red   = (byte)((pix  & 0x00FF0000) >> 16);
byte green = (byte)((pix  & 0x0000FF00) >> 8);
byte blue  = (byte)((pix  & 0x000000FF));

ピクセルは4byteの数値で返却されます。
この4byte(32bit)の中にはRGBの他に透明度(αチャネル)も含まれています。
RGB・透明度への各ビットの振り分けは以下のようになっています。

ARGB

これをもとに必要な項目以外のビットを落とすために積を取得し、対象ビットが右側に来るようにシフトをおkなっています。
これでピクセルに対して各値の取得ができました。

読み込んだ画像の階調を確認

読み込んだ画像の階調はどれなのかは以下を使って取得ができます。

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.photo);
Log.d("ImageSample", bmp.getConfig().name());

ログへ出力した値は次のどれかになります。
1) ARGB_8888:透明度(8bit)+RGB(各8bit)の32bpp
2) ARGB_4444:透明度(4bit)+RGB(各4bit)の16bpp
3) RGB_565:透明度なし+RGB(5bit,6bit,5bit)の16bpp
4) ALPHA_8:透明部(8bit)のみを表現

bppだけで見ると勘違いしやすいのが2)と3)ですね。
両方とも16bppのため表現できる色は同じだと思ってしましますが、実施の色を表現する場合、2)は4bitごとなので色だけで判断すると4,096色しか表示できません。その代り透明度の利用が可能。3)は透明色なしで65,536色表現できます。

各ピクセルのRGB値を変更することで、たとえばモノトーンやセピアなど画像の色表示を変更することができます。
実際の変更方法はまた次回書きたいと思います。

※画像処理に関しては勉強を始めたばかりです。記載誤りや補足などありましたらコメントいただけるとうれしいです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

この記事のトラックバック用URL