这部分我对这三个十六进制正在做什么感到困惑,例如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;
答案 0 :(得分:3)
像素的颜色信息以单个32位整数编码。最低的8位存储蓝色信息,位8到15存储绿色,16到23存储红色。比特24到31存储阿尔法值。您首先显示的代码通过使用和操作屏蔽它们来选择正确的位。为了用它们进行计算,它们被移动以表示它们的实际值。
clr & 0x0000ff00
选择位置8到15的位,
(clr & 0x0000ff00) >> 8
将结果向右移动8个位置。
答案 1 :(得分:2)
在
int red = (clr & 0x00ff0000) >> 16;
&
将所有位除零,除了那些需要的位:
0x00123456 & 0x00ff0000 == 0x00120000
位移将把这些位置于所需位置:
0x00120000 >> 16 == 0x00000012 == 0x12
同样适用于其他两个频道。
0x00123456 & 0x0000ff00 == 0x00003400
0x00003400 >> 16 == 0x34
0x00123456 & 0x000000ff == 0x56
原因是ARGB格式将四个字节(alpha,red,green,blue)填充到一个int:0xAaRrGgBb
中。 RGB格式类似,只是它不使用alpha(不透明度)通道。比特移位背后的重点是将这些字节分开:clr == 0x123456
到red == 0x12
green == 0x34
blue == 0x56
请注意,每个字节(8位)由十六进制表示的两个十六进制数字(每个4位)表示,因此移位16位移位4 * 4位= 4个十六进制数字= 2个字节。