了解 BufferedImage.getRGB 输出值

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

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

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


答案 1

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

具有 32 位,3x8 = 24 用于以下格式存储 RGB 分量(每个分量为 8 位):int

               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

答案 2

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

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

然后,您可以使用 、 、 、 获取红色、绿色、蓝色或 Alpha 值。然后,这些方法将以熟悉的格式返回一个值,该值具有值getRed()getGreen()getBlue()getAlpha()int0 < value < 255

int red = mycolor.getRed();

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