2010-11-13 16 views
11

¿Cómo interpreto la matriz devuelta del método build-in getPixels para un mapa de bits?Explicación del método getPixels para un mapa de bits en Android

Aquí está mi código:

public void foo() { 
    int[] pixels; 
    Bitmap bitmapFoo = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.test2);    
    int height = bitmapFoo.getHeight(); 
    int width = bitmapFoo.getWidth(); 

    pixels = new int[height * width]; 

    bitmapFoo.getPixels(pixels, 0, width, 1, 1, width - 1, height - 1);  
} 

la matriz "píxeles" es retornada con los valores de -988 602 635 a 1242635509 y eso fue sólo de unos pocos colores en un archivo PNG sencilla que hice. ¿Cómo puedo interpretar los números que se obtienen de este método?

Editar: Me doy cuenta de que este entero único representa un color. Simplemente no entiendo cómo interpretar este entero único en los valores RBG y alfa que componen el color.

Gracias.

PS. Si te preguntas a ti mismo, "¿qué está tratando de hacer?" Estoy tratando de encontrar una manera de modificar dinámicamente el color de un mapa de bits.

+0

Sus argumentos simples para getPixels me han salvado ... – Betaminos

Respuesta

10

devuelve un int para el Color class.

La clase Color define métodos para la creación y la conversión de enteros de color. Los colores se representan como en paquetes de, compuestos de 4 bytes: alfa, rojo, verde, azul. Los valores no se multiplican, , lo que significa que cualquier transparencia se almacena únicamente en el componente alfa y no en en los componentes de color. Los componentes se almacenan de la siguiente manera (alpha < < 24) | (rojo < < 16) | (verde < < 8) | azul. Cada componente tiene un rango de entre 0..255 con 0 que significa que no hay contribución para ese componente, y 255 significa contribución del 100%. Por lo tanto opaco negro sería 0xFF000000 (100% opaca pero no contribuye de rojo, Gree, azul y opaca de color blanco sería 0xFFFFFFFF

Por ejemplo, cuando se utiliza el objeto de pintura:

Paint pRed = new Paint(); 
pRed.setColor(Color.RED); 

setColor espera un int. Color.RED es que el valor int por su significado predefinido de "rojo".

+0

Hola, gracias, pero sé que es un color. Debería haber formulado mejor mi pregunta, para preguntar qué era lo que realmente quería. Eso es malo y ha sido editado. +1. – user432209

+0

@ user432209 vea mi porción citada. (alfa << 24) | (rojo << 16) | (verde << 8) | azul es cómo se empacan los colores en el int. –

+0

Esta es la parte que no entiendo. (alfa << 24) | (rojo << 16) | (verde << 8) no tiene sentido para mí. – user432209

1

Si usted tiene su alfa, los valores de rojo, verde y azul, su color es igual a (alpha < < 24) + (rojo < < 16) + (verde < < 8) + azul.

Para recuperar su alfa, los valores de rojo, verde y azul de un int, dicen ARGB:

int alpha=argb>>24; 
int red=(argb-alpha)>>16; 
int green=(argb-(alpha+red))>>8; 
int blue=(argb-(alpha+red+green)); 
5

Aún más:

int alpha=argb>>24; 
int red=(argb & 0x00FF0000)>>16; 
int green=(argb & 0x0000FF00)>>8; 
int blue=(argb & 0x000000FF); 
14

Usted también puede realizar lo siguiente para recuperar los colores de un int:

int mColor = 0xffffffff; 

int alpha = Color.alpha(mColor); 
int red = Color.red(mColor); 
int green = Color.green(mColor); 
int blue = Color.blue(mColor); 
0

Además de eso, creo que debería ser

bitmapFoo.getPixels(pixels, 0, width, 0, 0, width, height); 

Las coordenadas comienzan desde 0, ¿verdad?

+0

De acuerdo con el documento de [getPixels] (http://developer.android.com/reference/android/graphics/Bitmap.html), Stride debe ser> = ancho del mapa de bits. Has usado '0' para caminar aquí. –

+0

El tercer parámetro es zancada, que es igual al ancho en el ejemplo. La lista de parámetros es la siguiente: 'int [] pixels, int offset, int stride, int x, int y, int width, int height – BVB

Cuestiones relacionadas