了解 BufferedImage.getRGB 输出值

新手上路,请多包涵

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

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

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

原文由 leonardo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

getRGB(int x, int y) 返回位置 (x,y) 处颜色像素的值。

您误解了返回值。

它是二进制格式。像 11…11010101,它作为 int 值提供给您。

如果您想获得该值的 RGB(即红、绿、蓝)分量,请使用 Color 类。例如

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

Then you can get the Red, Green, Blue, or Alpha values by using getRed() , getGreen() , getBlue() , getAlpha() .然后这些方法将以熟悉的格式返回一个 int0 < value < 255

 int red = mycolor.getRed();

如果您不想使用 Color 类,那么您将需要使用按位运算来获取它的值。

原文由 afzalex 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

原文由 icza 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题