2011-12-27 4 views
5

que tienen una porción de código que he encontrado al intentar conseguir valores de los píxeles de una imagen, y yo no lo entiendo del todo,La comprensión de esta pieza de código (extracción de componente de color desde un entero)

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

Entiendo que está agregando 1 al valor si el color rojo está allí, y creo que el bit 0x00ff0000 es un valor hexadecimal para el rojo, y el >> se desplaza 16 bits hacia la derecha.

¿Cuál es la explicación?

+1

Prefiero 'int red = ((rgb >> 16) & 0xff);'. –

Respuesta

10

Esto está extrayendo el componente rojo de un número que (se presumiría) representa un color en aRGB.

Primero:

(rgb & 0x00ff0000) 

... utiliza bit a bit y a cero todos los bits de rgb excepto los del byte que contiene el componente rojo(el tercer byte más significativo). Entonces, ese valor se desplaza a la derecha 16 lugares (usando >> 16), de modo que ocupe el byte más a la derecha, cuyo valor se asigna entonces a red.

Por ejemplo, supongamos que tienes un int que representa vivid cyan:

int color = 0x0012faff; 

Entonces, esto:

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

Lienzo:

18 

... que es el valor decimal para el hex 0x12 (del rojo posición en color arriba).

Del mismo modo, puede obtener los valores de los verdes y azules componentes con lo siguiente:

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

La línea: "int redOnly = color & 0x00ffff0000;" debería ser "int redOnly = color & 0x00ff0000;" derecho ? – Swagatika

+0

@Swagatika - Sí. Error de tipografía. Fijo. –

+0

Explicación muy clara que uno puede tener. Gracias por la respuesta. – Swagatika

2

rgb mantiene los valores de rojo, azul y verde para el píxel (presumiblemente almacenada en una 32 bit int). rgb & 0x00ff0000 enmascara todo excepto los bits rojos. El desplazamiento de 16 bits mueve los bits rojos a las posiciones significativas más bajas antes de que se asignen a la variable red.

3

Digamos que inicie la operación con valor 0x00rrggbb donde r, g y b son dígitos hexadecimales arbitrarios. En este caso,

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

Al final, tiene el valor del componente rojo. Puede extraer otros componentes usando operaciones similares.

+1

'0x00rrggbb y 0x00ff0000', no' &&' ;) – fge

+0

@fge Por supuesto. ¡Gracias! –

2

El & es un operador bit a bit.Para cualquier bit a y b, a & b es 1 si y solo si ambos a y b es igual a uno. Para cualquier bit x, x & 1 es igual a x y x & 0 es igual a 0.

Por lo tanto, para cualquier número entero i (que es de 32 bits de longitud), i & 0x00ff0000 dejará sólo el componente de color rojo en una RGB:

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

Hay otras maneras de extraer r, g, y b:

(rgb >> 16) & 0xff # red 
(rgb >> 8) & 0xff # green 
rgb & 0xff   # blue 
Cuestiones relacionadas