我正尝试在Android上使用copyPixelsToBuffer
和copyPixelsFromBuffer
方法获取以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的预期工作方式吗?有没有任何方法可以获取byte[]中的原始数据?
添加响应下面答案的内容:
在copyPixelsToBuffer之前放置buffer.order(ByteOrder.nativeOrder());的确会改变结果,但仍不是我想要的方式:
pixel before = ef234567
value before = ef614121
value after = ffffff41
pixel after = ff41ffff
似乎遭受基本相同的问题(alpha被应用于每个copyPixelsFrom/ToBuffer
)。
Bitmap.getPixels()
吗?文档明确说明它返回未预乘的 ARGB 像素。下面也有关于getPixels()
的答案,但你没有评论它。 - Andreas