2011-12-27 20 views
5

Tôi có một đoạn mã mà tôi thấy khi cố gắng để có được giá trị pixel từ một hình ảnh, và tôi không hoàn toàn hiểu nó,Hiểu đoạn mã này (chiết xuất thành phần màu từ số nguyên)

red = (rgb & 0x00ff0000) >> 16; 

Tôi hiểu rằng nó thêm 1 vào giá trị nếu màu đỏ ở đó, và tôi nghĩ rằng bit 0x00ff0000 là một giá trị thập lục phân cho màu đỏ, và >> dịch 16 bit sang phải.

Giải thích là gì?

+1

Tôi thích 'int red = ((rgb >> 16) & 0xff);'. –

Trả lời

10

Thao tác này sẽ trích xuất thành phần màu đỏ từ số mà (người sẽ giả định) đại diện cho một màu trong aRGB.

Đầu tiên:

(rgb & 0x00ff0000) 

... sử dụng Bitwise và về không tất cả các bit của rgb trừ những từ byte chứa đỏ phần (thứ ba byte quan trọng nhất). Sau đó, giá trị đó được dịch chuyển sang phải 16 vị trí (bằng cách sử dụng >> 16), do đó nó chiếm phần lớn byte phải, sau đó giá trị đó được gán cho red.

Ví dụ, giả sử bạn đã có một int đại diện vivid cyan:

int color = 0x0012faff; 

Sau đó, điều này:

int redOnly = color & 0x00ff0000; 
System.out.println(redOnly >> 16); 

Prints:

18 

... đó là giá trị thập phân cho hex 0x12 (từ màu đỏ vị trí trong color ở trên).

Tương tự, bạn có thể nhận được các giá trị của xanh thành phần màu xanh với những điều sau:

int green = (color & 0x0000ff00) >> 8; // 250 = 0xfa 
int blue = (color & 0x000000ff); // 255 = 0xff 
+0

Dòng: "int redOnly = color & 0x00ffff0000;" phải là "int redOnly = color & 0x00ff0000;" đúng ? – Swagatika

+0

@Swagatika - Yep. Typo. Đã sửa. –

+0

Giải thích rất rõ ràng người ta có thể có. Cảm ơn câu trả lời. – Swagatika

2

rgb giữ các giá trị đỏ, xanh dương và màu xanh lá cây cho các điểm ảnh (có lẽ được lưu giữ trong một Int 32 bit). rgb & 0x00ff0000 mặt nạ tắt tất cả trừ các bit màu đỏ. Sự dịch chuyển 16 bit di chuyển các bit màu đỏ đến các vị trí quan trọng thấp nhất trước khi chúng được gán cho biến số red.

3

Giả sử bạn bắt đầu hoạt động với giá trị 0x00rrggbb trong đó r, gb là các chữ số thập lục phân tùy ý. Trong trường hợp này,

0x00rrggbb & 0x00ff0000 -> 0x00rr0000 // bitwise-and operation 
0x00rr0000 >> 16  -> 0x000000rr // shift-right operation 

Cuối cùng, bạn có giá trị của thành phần màu đỏ. Bạn có thể trích xuất các thành phần khác bằng cách sử dụng các hoạt động tương tự.

+1

'0x00rrggbb & 0x00ff0000', không phải là '&&' ;) – fge

+0

@fge Tất nhiên. Cảm ơn bạn! –

2

& là một toán tử bitwise.Đối với bất kỳ bit ab, a & b là 1 nếu và chỉ khi cả hai ab bằng một. Đối với bất kỳ bit x, x & 1 bằng xx & 0 bằng 0.

Vì vậy, đối với bất kỳ số nguyên i (đó là 32 bit chiều dài), i & 0x00ff0000 sẽ để lại chỉ là thành phần màu đỏ trong một RGB:

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # the RGB value, and 
00000000111111110000000000000000 # 0x00ff0000 
-------------------------------- # and'ed together, give 
00000000xxxxxxxx0000000000000000 # that 

Có nhiều cách khác để giải nén r, g, b:

(rgb >> 16) & 0xff # red 
(rgb >> 8) & 0xff # green 
rgb & 0xff   # blue 
Các vấn đề liên quan