我尝试在从外部来源收到字节后,使用Bitmap
在Android中创建Bitmap.Config.ARGB_8888
。据我所知,在Bitmap
(不使用JNI
)中设置原始字节的最快方法是使用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
中的原始字节?
答案 0 :(得分:1)
我想我会给出更新的答案,因为我最近对此感到困惑。
调用 setPixels()
与 copyPixelsFromBuffer()
时的行为确实反映了高级 API 中颜色表示方式与位图中字节的实际内部顺序的差异。这有点记录在 Bitmap 类中(至少现在),但不容易解析。
带有 setPixels()
的更高级的接口需要整数,因为它们在其他高级接口(如资源和 Color 类)中也是如此,因此 ARGB as noted here。然后,您可以轻松地执行以下操作:bitmap.setPixel(0,0,Color.RED)
。 Color 类提到排序 here 为:
int color = (A & 0xff) << 24 | (R & 0xff) << 16 | (G & 0xff) << 8 | (B & 0xff);
正如您从copyPixelsFromBuffer()
中发现的那样,内部表示是 RGBA。它有点暗示在 Bitmap.Config here 中,如下所示,也在 NDK Bitmap 标头中将其命名为枚举 ANDROID_BITMAP_FORMAT_RGBA_8888:
int color = (A & 0xff) << 24 | (B & 0xff) << 16 | (G & 0xff) << 8 | (R & 0xff);
答案 1 :(得分:0)
关于文件:
https://developer.android.com/reference/android/graphics/Color.html
有几种用法,即RGBA模型。
例如pack(int color)
方法。在sRGB颜色空间中指定的ARGB颜色int为RGBA颜色。
你可以尝试找到&#39; RGBA&#39;我给的页面中的单词。大多数基本概念都使用RGBA模型。