, поскольку эти функции требуют отрисовки источника, что не поддерживается для предварительно не умноженных растровых изображений.

аюсь получить доступ к необработанным данным растрового изображения в формате 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).

Ответы на вопрос(4)

Ваш ответ на вопрос