Estoy tratando de acceder a los datos brutos de un mapa de bits en formato ARGB_8888 en Android, utilizando los métodos copyPixelsToBuffer
y copyPixelsFromBuffer
. Sin embargo, la invocación de esas llamadas parece aplicar siempre el canal alfa a los canales rgb. Necesito los datos sin procesar en un byte [] o similar (para pasar por JNI; sí, sé sobre bitmap.h en Android 2.2, no puedo usar eso).Acceso a datos brutos en ARGB_8888 Android Bitmap
Este es un ejemplo:
// Create 1x1 Bitmap with alpha channel, 8 bits per channel
Bitmap one = Bitmap.createBitmap(1,1,Bitmap.Config.ARGB_8888);
one.setPixel(0,0,0xef234567);
Log.v("?","hasAlpha() = "+Boolean.toString(one.hasAlpha()));
Log.v("?","pixel before = "+Integer.toHexString(one.getPixel(0,0)));
// Copy Bitmap to buffer
byte[] store = new byte[4];
ByteBuffer buffer = ByteBuffer.wrap(store);
one.copyPixelsToBuffer(buffer);
// Change value of the pixel
int value=buffer.getInt(0);
Log.v("?", "value before = "+Integer.toHexString(value));
value = (value >> 8) | 0xffffff00;
buffer.putInt(0, value);
value=buffer.getInt(0);
Log.v("?", "value after = "+Integer.toHexString(value));
// Copy buffer back to Bitmap
buffer.position(0);
one.copyPixelsFromBuffer(buffer);
Log.v("?","pixel after = "+Integer.toHexString(one.getPixel(0,0)));
El registro muestra entonces
hasAlpha() = true
pixel before = ef234567
value before = 214161ef
value after = ffffff61
pixel after = 619e9e9e
entiendo que el orden de los canales ARGB es diferente; esta bien. Pero no deseo que se aplique el canal alfa en cada copia (que es lo que parece estar haciendo).
¿Es así como se supone que copyPixelsToBuffer
y copyPixelsFromBuffer
funcionan? ¿Hay alguna forma de para obtener los datos sin formato en un byte []?
añadido en respuesta a contestar a continuación:
Poner en buffer.order(ByteOrder.nativeOrder());
antes de la copyPixelsToBuffer
sí cambia el resultado, pero aún no en la forma que yo quiero:
pixel before = ef234567
value before = ef614121
value after = ffffff41
pixel after = ff41ffff
parece sufrir de esencia el mismo problema (alfa se aplica en cada copyPixelsFrom/ToBuffer
).
Hola, también encuentro este problema. ¿Has encontrado una manera de resolver esto? Tal vez la forma de convertir los datos a valores reales RGB? –
Es posible que desee comprobar '' Bitmap.isPremultiplied() '' también. Supongo que está configurado en '' true'' de forma predeterminada cuando el canal alfa está presente. – harism