真的与java像素操作混淆了

时间:2012-11-11 19:17:01

标签: java

这部分我对这三个十六进制正在做什么感到困惑,例如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;

2 个答案:

答案 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 == 0x123456red == 0x12 green == 0x34 blue == 0x56

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