0

这部分我很困惑这 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;
4

2 回答 2

3

像素的颜色信息以单个 32 位整数编码。最低 8 位存储蓝色信息,第 8 到 15 位存储绿色信息,第 16 到 23 位存储红色信息。位 24 到 31 存储 alpha 值。您首先显示的代码通过使用 and 操作屏蔽它们来选择正确的位。为了对它们进行计算,它们被移动以表示它们的实际值。

clr & 0x0000ff00

选择位置 8 到 15 的位,

(clr & 0x0000ff00) >> 8

将结果向右移动 8 个位置。

于 2012-11-11T19:25:51.630 回答
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 == 0x123456red == 0x12 green == 0x34 blue == 0x56

请注意,每个字节(8 位)用十六进制表示法中的两个十六进制数字(每个 4 位)表示,因此移位 16 位移位 4*4 位 = 4 个十六进制数字 = 2 个字节。

于 2012-11-11T19:26:52.933 回答