Android的ARGB_8888位图内部格式是否总是RGBA?

时间:2017-06-12 13:30:31

标签: android android-bitmap

我尝试在从外部来源收到字节后,使用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中的原始字节?

2 个答案:

答案 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模型。