Я пытаюсь получить доступ к необработанным данным растрового изображения в формате ARGB_8888 на Android, используя методы copyPixelsToBuffer
и copyPixelsFromBuffer
.Тем не менее, вызов этих вызовов, кажется, всегда применяет альфа-канал к каналам RGB.Мне нужны необработанные данные в байтах [] или аналогичных (для прохождения через JNI; да, я знаю о bitmap.h в Android 2.2, не могу использовать это).
Вот пример:
// 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)));
Журнал показывает
hasAlpha() = true
pixel before = ef234567
value before = 214161ef
value after = ffffff61
pixel after = 619e9e9e
Я понимаю, что порядок каналов argb другой;Все в порядке.Но я не хочу, чтобы альфа-канал применялся к каждой копии (что, похоже, и делает).
Так должны работать copyPixelsToBuffer
и copyPixelsFromBuffer
?Есть ли какой-либо способ получить необработанные данные в байтах []?
Добавлено в ответ на ответ ниже:
Ввод buffer.order(ByteOrder.nativeOrder());
до того, как copyPixelsToBuffer
изменит результат, но все же не так, как я хочу:
pixel before = ef234567
value before = ef614121
value after = ffffff41
pixel after = ff41ffff
Кажется, что страдает по существу от той же проблемы (альфа применяется к каждому copyPixelsFrom/ToBuffer
).