理解这段代码(从整数中提取颜色分量)

时间:2011-12-27 00:01:36

标签: java

我在尝试从图像中获取像素值时找到了一段代码,我不太明白,

red = (rgb & 0x00ff0000) >> 16;

据我所知,如果有红色,它会在值上加1,我认为0x00ff0000位是红色的十六进制值,>>向右移16位。 / p>

解释是什么?

4 个答案:

答案 0 :(得分:10)

这是从一个数字中提取 red 组件(一个人会假设)代表一个RGB中的颜色。

首先:

(rgb & 0x00ff0000)

...使用按位和rgb的所有位置零,除了来自包含 red 组件的字节(第三个最高有效字节)的那些位。然后,该值右移16位(使用>> 16),以便它占据最右边的字节,然后将其值分配给red

例如,假设您有int代表vivid cyan

int color = 0x0012faff;

然后,这个:

int redOnly = color & 0x00ff0000;
System.out.println(redOnly >> 16);

打印:

18

...这是十六进制0x12的十进制值(来自上面color中的红色位置)。

同样,您可以使用以下内容获取绿色蓝色组件的值:

int green = (color & 0x0000ff00) >> 8; // 250 = 0xfa
int blue = (color & 0x000000ff); // 255 = 0xff

答案 1 :(得分:3)

假设您以值0x00rrggbb开始操作,其中rgb是任意十六进制数字。在这种情况下,

0x00rrggbb & 0x00ff0000 -> 0x00rr0000 // bitwise-and operation
0x00rr0000 >> 16        -> 0x000000rr // shift-right operation

最后,你得到了红色成分的价值。您可以使用类似的操作提取其他组件。

答案 2 :(得分:2)

rgb保存像素的红色,蓝色和绿色值(可能存储在32位int中)。 rgb & 0x00ff0000掩盖了除红点以外的所有内容。在将红色位分配给red变量之前,16位移位将红色位移动到最低有效位置。

答案 3 :(得分:2)

&是一个按位运算符。对于任何位ab,如果a & b为1,且只有 ab等于1。对于任何位xx & 1等于xx & 0等于0

因此,对于任何整数i(长度为32位),i & 0x00ff0000将只留下RGB中的红色分量:

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # the RGB value, and
00000000111111110000000000000000 # 0x00ff0000
-------------------------------- # and'ed together, give
00000000xxxxxxxx0000000000000000 # that

还有其他方法可以提取r,g和b:

(rgb >> 16) & 0xff # red
(rgb >> 8) & 0xff  # green
rgb & 0xff         # blue