copyPixelsToBuffer
およびcopyPixelsFromBuffer
メソッドを使用して、Android で ARGB_8888 形式のビットマップの生データにアクセスしようとしています。ただし、これらの呼び出しを呼び出すと、常にアルファ チャネルが RGB チャネルに適用されるようです。byte[] または類似の生データが必要です (JNI を通過するため; はい、Android 2.2 の bitmap.h について知っていますが、それを使用することはできません)。
以下にサンプルを示します。
// 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
)。