Acesso a dados brutos no bitmap ARGB_8888 para Android
Estou tentando acessar os dados brutos de um Bitmap no formato ARGB_8888 no Android, usando ocopyPixelsToBuffer
ecopyPixelsFromBuffer
métodos. No entanto, a chamada dessas chamadas parece sempre aplicar o canal alfa aos canais rgb. Preciso dos dados brutos em um byte [] ou similar (para passar pela JNI; sim, eu sei sobre o bitmap.h no Android 2.2, não posso usá-lo).
Aqui está uma amostra:
// 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)));
O log mostra
hasAlpha() = true
pixel before = ef234567
value before = 214161ef
value after = ffffff61
pixel after = 619e9e9e
Eu entendo que a ordem dos canais argb é diferente; isso é bom. Mas não quero que o canal alfa seja aplicado a todas as cópias (que é o que parece estar fazendo).
É assim quecopyPixelsToBuffer
ecopyPixelsFromBuffer
deveria funcionar? Existequalquer maneira de obter os dados brutos em um byte []?
Adicionado em resposta à resposta abaixo:
Colocandobuffer.order(ByteOrder.nativeOrder());
antes de ocopyPixelsToBuffer
muda o resultado, mas ainda não da maneira que eu quero:
pixel before = ef234567
value before = ef614121
value after = ffffff41
pixel after = ff41ffff
Parece sofrer essencialmente do mesmo problema (o alfa é aplicado a cadacopyPixelsFrom/ToBuffer
)