了解BufferedImage.getRGB输出值

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

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

然后我打印出值,我看到黑色像素对应一个像“-16777216”这样的值,一种像“-16755216”之类的东西等等。有人可以解释一下这个值背后的逻辑吗?

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 < 225

 int red = mycolor.getRed(); 

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

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

int有32位,3×8 = 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 

它在文档中解释 :

返回默认RGB颜色模型中的整数像素(TYPE_INT_ARGB)[…]

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

检查值的简单(和慢速方法)是使用new java.awt.Color(colour, true); 然后打电话给吸气剂。

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

请参阅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 } 

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