2020/03/23 公開
・色をARGB値に分解
画像で使用されている色のうち24ビット(フルカラー)、32ビットカラーからR(赤)、G(緑)、B(青)、A(アルファ値)を抽出する方法を説明します。
JavaのBufferedImageクラスに読み込んだ画像の色情報は、getRGBメソッドで取得することができます。任意の画像座標(x,y)を引数として与えると色情報が取得できます。
BufferedImage.getRGBメソッド
■(x,y)で指定した画像座標の色情報を取得します。 パラメータ x : 画像のx座標(単位ピクセル) y : 画像のy座標(単位ピクセル) 戻り値 (x,y)の色情報
getRGBメソッドの戻り値は、int型(32bit)の整数で、以下の仕様で色の値が格納されています。
1画素をアルファ値(8bit)+赤成分(8bit)+緑成分(8bit)+青成分(8bit)=32bit
のように並べて表現しています。
この値からARGBへの分解には、ビット操作の右シフトとAND演算を使います。
右ビットシフトの演算子は、">>"で、指定した回数分ビットを右にずらす操作のことです。1回の右シフトは2で割ることと同じです。
AND演算は、ビットごとに演算する操作の1つで、両方のビットが1の場合だけ1となり、その他は0になります。
// (x,y)の色をcolorに代入 int color = img.getRGB( x, y ); // colorをargbに分解 int a = color >> 24; int r = ( color >> 16 ) & 0xff; int g = ( color >> 8 ) & 0xff; int b = color & 0xff;
それでは、上記のソースコードがどのように動いているかを例で確認していきましょう。
getRGBメソッドで取得したint型の変数colorの値を以下とします。
color = 11111110 10000000 00001111 00110100(ビット表現)
int a = color >> 24;
( color >> 24 )の値は、00000000 00000000 00000000 11111110
元のcolorのビットが右に24回シフトされています。
この演算により右から8ビットだけの値が残るので、0~255の範囲の値になります。
これがa(アルファ)の値です。
int r = ( color >> 16 ) & 0xff;
( color >> 16 )の値は、00000000 00000000 11111110 10000000
元のcolorのビットが右に16回シフトされています。
0xffをビットで表すと、 00000000 00000000 00000000 11111111
AND演算をした結果は、00000000 00000000 00000000 10000000
この演算により右から8ビットだけの値が残るので、0~255の範囲の値になります。
これがr(赤)の値です。
int g = ( color >> 8 ) & 0xff;
( color >> 8 )の値は、 00000000 11111110 10000000 00001111
元のcolorのビットが右に8回シフトされています。
0xffをビットで表すと、 00000000 00000000 00000000 11111111
AND演算をした結果は、00000000 00000000 00000000 00001111
この演算により右から8ビットだけの値が残るので、0~255の範囲の値になります。
これがg(緑)の値です。
24ビットカラーの場合でも色情報は32ビットで取得しますが、アルファ値(透過)を計算する必要はありません。必要であれば"11111111"(透過なし)にするのが無難です。
■関連コンテンツ
アルファ値(透過) | アルファ値(透過)について |
ビット演算子 | ビット演算子について解説 |
ビットシフト | ビットのずらしかた |
画像の色 | 画像の色について解説 |
減色処理(メディアンカット) | メディアンカットのJavaソース |
カラーマップ | 色番号に色を割り当て |
■新着情報
2022.07.07 | 外部プログラムの実行 | exeファイル実行 |
2022.07.06 | 完全数 | 6=1+2+3 |
■広告