我在尝试从图像中获取像素值时找到了一段代码,我不太明白,
red = (rgb & 0x00ff0000) >> 16;
据我所知,如果有红色,它会在值上加1,我认为0x00ff0000
位是红色的十六进制值,>>
向右移16位。 / p>
解释是什么?
答案 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
开始操作,其中r
,g
和b
是任意十六进制数字。在这种情况下,
0x00rrggbb & 0x00ff0000 -> 0x00rr0000 // bitwise-and operation
0x00rr0000 >> 16 -> 0x000000rr // shift-right operation
最后,你得到了红色成分的价值。您可以使用类似的操作提取其他组件。
答案 2 :(得分:2)
rgb
保存像素的红色,蓝色和绿色值(可能存储在32位int中)。 rgb & 0x00ff0000
掩盖了除红点以外的所有内容。在将红色位分配给red
变量之前,16位移位将红色位移动到最低有效位置。
答案 3 :(得分:2)
&
是一个按位运算符。对于任何位a
和b
,如果,a & b
为1,且只有 a
和b
等于1。对于任何位x
,x & 1
等于x
和x & 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