0

この部分では、00ff0000 などのこれら 3 つの 16 進数が何をしているのか、およびそれらが 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 には、アルファ値が格納されます。最初に示すコードは、and 操作を使用してマスクすることにより、適切なビットを選択します。それらを使って計算を行うために、それらは実際の値を表すように移動されます。

clr & 0x0000ff00

位置 8 ~ 15 のビットを選択し、

(clr & 0x0000ff00) >> 8

結果を 8 桁右に移動します。

于 2012-11-11T19:25:51.630 に答える
2

In

int  red   = (clr & 0x00ff0000) >> 16;

The & will zero out all bits except those that are wanted:

0x00123456 & 0x00ff0000 == 0x00120000

The bit shift will place these bits at the desired position:

0x00120000 >> 16 == 0x00000012 == 0x12

Similarly for the other two channels.

0x00123456 & 0x0000ff00 == 0x00003400
0x00003400 >> 16 == 0x34

0x00123456 & 0x000000ff == 0x56

The reason for this is that the ARGB format stuffs four bytes (alpha, red, green, blue) into one int: 0xAaRrGgBb. The RGB format is similar except it doesn't use the alpha (opacity) channel. The whole point behind the bit-shifting is to separate those bytes: clr == 0x123456 to red == 0x12 green == 0x34 blue == 0x56

Note that each byte (8 bits) is represented by two hexadecimal digits (4 bits each) in the hexadecimal notation, so shifting by 16 bits shifts by 4*4 bits = 4 hexadecimal digits = 2 bytes.

于 2012-11-11T19:26:52.933 に答える