了解BufferedImage.getRGB输出值
image-processing
java
5
0

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

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

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

参考资料:
Stack Overflow
收藏
评论
共 5 个回答
高赞 时间 活跃

请参见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   }
收藏
评论

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

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

然后,您可以使用getRed()getGreen()getBlue()getAlpha()来获得Red,Green或Blue值。然后,这些方法将以熟悉的格式返回int值,其值为0 < value < 255

int red = mycolor.getRed();

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

收藏
评论

实际上,您可以通过Integer.toBinaryString(-16755216)将int转换为二进制字符串,即11111111000000000101010111111110000。它由4个字节组成:alpha,红色,绿色,蓝色。这些值是未预乘的,这意味着任何透明度仅存储在alpha分量中,而不存储在颜色分量中。组件存储如下(alpha << 24)| (红色<< 16)| (绿色<< 8)|蓝色。每个组件的范围在0..255之间,其中0表示对该组件无贡献,而255表示100%贡献。因此,不透明黑色为0xFF000000(100%不透明,但红色,绿色或蓝色没有贡献),不透明白色为0xFFFFFFFF。

收藏
评论

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
收藏
评论

在文档中对此进行了解释

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

因此,您将获得8位alpha通道,8位红色,8位绿色,8位蓝色。

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

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号