我正在尝试使用copyPixelsToBuffer
andcopyPixelsFromBuffer
方法在 Android 上访问 ARGB_8888 格式的位图的原始数据。然而,这些调用的调用似乎总是将 alpha 通道应用于 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 通道的顺序是不同的;没关系。但我不希望将 alpha 通道应用于每个副本(这似乎是在做的事情)。
这是如何copyPixelsToBuffer
和copyPixelsFromBuffer
应该工作的?有什么方法可以获取字节 [] 中的原始数据吗?
为响应以下答案而添加:
buffer.order(ByteOrder.nativeOrder());
在确实改变结果之前放入copyPixelsToBuffer
,但仍然不是我想要的方式:
pixel before = ef234567
value before = ef614121
value after = ffffff41
pixel after = ff41ffff
似乎遇到了基本相同的问题(每个都应用了 alpha copyPixelsFrom/ToBuffer
)。