了解BufferedImage.getRGB输出值

时间:2014-09-10 09:06:53

标签: java image-processing colors rgb bufferedimage

我使用此方法获取图像中像素的整数值:

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

然后我打印出这些值,我发现黑色像素对应的值类似于" -16777216",这是一种类似" -16755216"有人可以解释一下这个价值背后的逻辑吗?

5 个答案:

答案 0 :(得分:45)

RGB int颜色在其位中包含颜色的红色,绿色,蓝色分量。您必须查看其二进制或十六进制表示,而不是将其视为整数(不要查看其十进制表示)。

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;

如果颜色也有一个alpha分量(透明度)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

alpha值为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

答案 1 :(得分:31)

getRGB(int x, int y)返回位置(x,y)处的颜色像素值。
您错误解释了返回的值 它是二进制格式。 比如11 ... 11010101,这是作为int值给你的 如果要获取该值的RGB(即红色,绿色,蓝色)分量,请使用Color类。例如

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

然后,您可以使用getRed()getGreen()getBlue()getAlpha()获取红色,绿色或蓝色值。 然后,这些方法将以熟悉的格式返回int值,其值为0 < value < 255

int red = mycolor.getRed();

如果您不想使用Color类,则需要使用按位运算来获取其值。

答案 2 :(得分:5)

它是explained in the docs

  

返回默认RGB颜色模型(TYPE_INT_ARGB)[...]

中的整数像素

所以你得到8位alpha通道,8位红色,8位绿色,8位蓝色。

检查值的简单(和慢速方法)是使用new java.awt.Color(colour, true);然后调用getter。

或者您可以将值打印为无符号32位十六进制值:Integer.toString(colour, 16)。输出的每两个字符将是ARGB集的一部分。

答案 3 :(得分:5)

请参阅ColorModel.getRgb的{​​{3}}:

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

答案 4 :(得分:3)

实际上,您可以通过Integer.toBinaryString(-16755216)将int转换为二进制字符串,即11111111000000000101010111110000.it由4个字节组成:alpha,red,green,blue。这些值未经过多次修改,这意味着任何透明度都只存储在alpha组件中,而不是存储在颜色组件中。组件存储如下(α<24)| (红色&lt;&lt; 16)| (绿色&lt;&lt; 8)|蓝色。每个组件的范围在0..255之间,0表示对该组件没有贡献,255表示100%贡献。因此,opaque-black将为0xFF000000(100%不透明但没有红色,绿色或蓝色的贡献),而opaque-white将为0xFFFFFFFF。