我正在尝试使用Bitmap.Config.ARGB_8888
在Android中创建Bitmap
,并在从外部源接收到字节后这样做。据我所知,在不使用JNI
的情况下,设置Bitmap
中的原始字节最快的方法是使用copyPixelsFromBuffer()
方法,但是问题在于缓冲区中字节的正确顺序。
经过一些试验和错误,尽管Config.ARGB_8888
建议正确的ARGB
顺序,但似乎Bitmap
使用的内部格式是RGBA
。您可以使用以下方法在Activity
中测试此行为,即在onCreate()
中(我已在Android 4.4.4中进行了测试,虽然该方法测试的是copyPixelsToBuffer()
,但根据我的测试,copyPixelsFromBuffer()
的行为相同):
private void testBitmap() {
// one pixel bitmap
Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
// as per javadoc, the int value is in ARGB format, so A=0xFF, R=0x11, G=0x22, B=0x33
bitmap.setPixel(0, 0, 0xFF112233);
ByteBuffer buffer = ByteBuffer.allocateDirect(4); // 4 bytes for the single pixel
bitmap.copyPixelsToBuffer(buffer);
buffer.position(0);
// prints "Bytes: 0x11 0x22 0x33 0xFF" (RGBA)
System.out.println(String.format(Locale.ENGLISH, "Bytes: %s %s %s %s",
toHexString(buffer.get()),
toHexString(buffer.get()),
toHexString(buffer.get()),
toHexString(buffer.get())
));
}
private static String toHexString(byte b) {
return Integer.toHexString(b & 0xFF).toUpperCase();
}
我的问题是:这个内部格式是否有文档记录?如果没有,那么我们怎么知道上面的代码在未来的Android版本中不会出现问题?或者也许有其他建议来复制Bitmap
中的原始字节吗?
ByteBuffer#order()
有关吗?只是猜测... - pskinkBGRA
。我提到的格式只在 alpha 通道上有所不同。 - c.s.RGBA
,而不是你说的BGRA
,你能否改用int[] arr = new int[1]; bitmap.getPixels(arr, 0, 1, 0, 0, 1, 1); Log.d(TAG, "test: " + Integer.toHexString(arr[0]));
? - pskinkgetPixels()
/setPixels()
则将字节转换为打包的int
。我正在寻找尽可能避免转换的方法。 - c.s.ARGB_*
常量的方式,对于 ndk 来说,它们更加精确:https://developer.android.com/ndk/reference/group___bitmap.html#gaea286a2d4c61ae2abb02b51500499f13 - pskink