web-dev-qa-db-ja.com

BufferedImage.getRGB出力値について

私はこのメソッドを使用して画像のピクセルの整数値を取得しています:

int colour = img.getRGB(x, y);

次に、値を印刷していますが、黒いピクセルが「-16777216」のような値に対応し、青色の種類が「-16755216」のようなものに対応していることがわかります。

32
leonardo

getRGB(int x, int y)は、位置(x、y)のカラーピクセルの値を返します。
戻り値を誤って解釈しています。
バイナリ形式です。 11 ... 11010101のように、int値として与えられます。
その値のRGB(つまり、赤、緑、青)コンポーネントを取得する場合は、Colorクラスを使用します。例えば.

_Color mycolor = new Color(img.getRGB(x, y));
_

次に、getRed()getGreen()getBlue()getAlpha()を使用して、赤、緑、または青の値を取得できます。次に、これらのメソッドによって、値_0 < value < 255_を持つおなじみの形式でint値が返されます。

_int red = mycolor.getRed();
_

Colorクラスを使用したくない場合は、ビット単位の演算を使用して値を取得する必要があります。

32
afzalex

RGB int色には、ビットの色の赤、緑、青の成分が含まれています。あなたは、そのバイナリまたは16進数表現を見なければならず、整数として見ないでください(その10進表現を見ないでください)。

intには32ビットがあり、3x8 = 24を使用してRGBコンポーネント(各8ビット)を次の形式で保存します。

               2          1          0
bitpos      32109876 54321098 76543210
------   --+--------+--------+--------+
bits     ..|RRRRRRRR|GGGGGGGG|BBBBBBBB|

ビットマスクを使用してコンポーネントを抽出または設定できます。

int color = img.getRGB(x, y);

// Components will be in the range of 0..255:
int blue = color & 0xff;
int green = (color & 0xff00) >> 8;
int red = (color & 0xff0000) >> 16;

色にアルファ成分(透明度)ARGBも含まれている場合、最後の残りの8ビットが取得されます。

           3          2          1          0
bitpos    10987654 32109876 54321098 76543210
------   +--------+--------+--------+--------+
bits     |AAAAAAAA|RRRRRRRR|GGGGGGGG|BBBBBBBB|

そして値:

int alpha = (color & 0xff000000) >>> 24; // Note the >>> shift
                                         // required due to sign bit

アルファ値255は、色が完全に不透明であることを意味し、値0は、色が完全に透明であることを意味します。

あなたの色:

あなたの色はcolor = -16755216次のものがあります。

blue : 240         // Strong blue
green:  85         // A little green mixed in
red  :   0         // No red component at all
alpha: 255         // Completely opaque
47
icza

実装 of ColorModel.getRgb

589  public int getRGB(int pixel) {
590        return (getAlpha(pixel) << 24)
591             | (getRed(pixel) << 16)
592             | (getGreen(pixel) << 8)
593             | (getBlue(pixel) << 0);
594   }
6
Jens

ドキュメントで説明

デフォルトのRGBカラーモデル(TYPE_INT_ARGB)の整数ピクセルを返します[...]

したがって、8ビットのアルファチャネル、8ビットの赤、8ビットの緑、8ビットの青が得られます。

値を調べる簡単な(そして遅い方法)new Java.awt.Color(colour, true);を使用してからゲッターを呼び出すことです。

または、値を符号なし32ビット16進値として印刷することもできます:Integer.toString(colour, 16)。出力の各2文字は、ARGBセットの一部になります。

5
Aaron Digulla

実際には、int.toBinaryString(-16755216)でintをバイナリ文字列に変換できます。これは4バイトで構成される11111111000000000101010111110000.itで、アルファ、赤、緑、青です。値は事前乗算されません。つまり、透明度は色成分ではなくアルファ成分のみに保存されます。コンポーネントは次のように保存されます(alpha << 24)| (赤<< 16)| (緑<< 8)|青。各コンポーネントの範囲は0..255で、0はそのコンポーネントへの寄与がないことを意味し、255は100%の寄与を意味します。したがって、不透明な黒は0xFF000000(100%不透明ですが、赤、緑、または青の寄与なし)、不透明な白は0xFFFFFFFFになります。

3
ben