这部分我对这 3 个十六进制在做什么(例如 00ff0000)以及为什么它们被位移 16 或 8 位感到困惑
// Getting pixel color by position x=100 and y=40
int clr= image.getRGB(100,40);
int red = (clr & 0x00ff0000) >> 16;
int green = (clr & 0x0000ff00) >> 8;
int blue = clr & 0x000000ff;
像素的颜色信息以单个 32 位整数编码。最低的8位存储蓝色信息,第8至15位存储绿色,16至23位存储红色。位 24 到 31 存储 alpha 值。首先显示的代码通过使用 and 操作屏蔽正确的位来选择正确的位。为了对它们进行计算,它们被移动以表示它们的实际值。
clr & 0x0000ff00
选择位置 8 到 15 处的位,
(clr & 0x0000ff00) >> 8
将结果向右移动 8 个位置。
in
int red = (clr & 0x00ff0000) >> 16;
&
将清零除所需位之外的所有位:
0x00123456 & 0x00ff0000 == 0x00120000
位移会将这些位放置在所需位置:
0x00120000 >> 16 == 0x00000012 == 0x12
其他两个通道也是如此。
0x00123456 & 0x0000ff00 == 0x00003400
0x00003400 >> 16 == 0x34
0x00123456 & 0x000000ff == 0x56
原因是 ARGB 格式将四个字节(字母、红色、绿色、蓝色)塞进一个 int: 0xAaRrGgBb
.RGB 格式类似,只是不使用 alpha(不透明度)通道。位移背后的重点是分隔这些字节:clr == 0x123456
到red == 0x12
green == 0x34
blue == 0x56
字节(8 位)在十六进制表示法中由两个十六进制数字(每个 4 位)表示,因此移位 16 位会移位 4*4 位 = 4 个十六进制数字 = 2 个字节。