web-dev-qa-db-ja.com

Java赤、緑、青を個別に取得するBufferedImage

getRGB()メソッドは、単一のintを返します。赤、緑、青の色をすべて0〜255の値として個別に取得するにはどうすればよいですか?

48
deltanovember

Javaの Color クラスは変換を実行できます。

Color c = new Color(image.getRGB());
int red = c.getRed();
int green = c.getGreen();
int blue = c.getBlue();
71
Michael Mrozek

ピクセルは、次のように4バイト(32ビット)整数で表されます。

00000000 00000000 00000000 11111111
^ Alpha  ^Red     ^Green   ^Blue

したがって、個々の色成分を取得するには、少しのバイナリ演算が必要です。

int rgb = getRGB(...);
int red = (rgb >> 16) & 0x000000FF;
int green = (rgb >>8 ) & 0x000000FF;
int blue = (rgb) & 0x000000FF;

これは確かに Java.awt.Color クラスメソッドは:

  553       /**
  554        * Returns the red component in the range 0-255 in the default sRGB
  555        * space.
  556        * @return the red component.
  557        * @see #getRGB
  558        */
  559       public int getRed() {
  560           return (getRGB() >> 16) & 0xFF;
  561       }
  562   
  563       /**
  564        * Returns the green component in the range 0-255 in the default sRGB
  565        * space.
  566        * @return the green component.
  567        * @see #getRGB
  568        */
  569       public int getGreen() {
  570           return (getRGB() >> 8) & 0xFF;
  571       }
  572   
  573       /**
  574        * Returns the blue component in the range 0-255 in the default sRGB
  575        * space.
  576        * @return the blue component.
  577        * @see #getRGB
  578        */
  579       public int getBlue() {
  580           return (getRGB() >> 0) & 0xFF;
  581       }
112
João Silva

分割するには、いくつかの基本的なバイナリ演算が必要になります。

int blue = rgb & 0xFF;
int green = (rgb >> 8) & 0xFF;
int red = (rgb >> 16) & 0xFF;

(または逆の場合もありますが、正直なところ覚えていないし、ドキュメントからすぐに答えが得られません)

8
Matti Virkkunen

単純な色の操作には、次を使用できます

bufImg.getRaster().getPixel(x,y,outputChannels)

OutputChannelsは、フェッチされたピクセルを格納するための配列です。その長さは、画像の実際のチャンネル数に依存します。たとえば、RGB画像には3つのチャンネルがあります。 RGBA画像には4つのチャンネルがあります。

このメソッドには、int、float、doubleの3つの出力タイプがあります。 0〜255の範囲の色の値を取得するには、実際のパラメーターoutputChannelsをint []配列にする必要があります。

7
Defd