49

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

4

4 に答える 4

122

ピクセルは、次のように 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       }
于 2010-04-11T00:06:53.980 に答える
73

Java のColorクラスは変換を行うことができます。

Color c = new Color(image.getRGB());
int red = c.getRed();
int green = c.getGreen();
int blue = c.getBlue();
于 2010-04-11T00:05:57.050 に答える
8

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

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

(または、その逆かもしれませんが、正直なところ思い出せず、ドキュメントからすぐに答えが得られません)

于 2010-04-11T00:06:18.407 に答える
7

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

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

outputChannels は、フェッチされたピクセルを格納するための配列です。その長さは、画像の実際のチャネル数によって異なります。たとえば、RGB イメージには 3 つのチャネルがあります。RGBA イメージには 4 つのチャネルがあります。

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

于 2010-04-11T03:25:51.140 に答える