首页 > 解决方案 > 试图理解 Bitmap.Config.ARBG_8888

问题描述

我试图了解 ARGB_8888 格式的颜色字节包装。

文档指出应使用以下公式进行打包:

int color = (A & 0xff) << 24 | (B & 0xff) << 16 | (G & 0xff) << 8 | (R & 0xff);

但它不应该是:

int color = (A & 0xff) << 24 | (R & 0xff) << 16 | (G & 0xff) << 8 | (B & 0xff);

当我从具有所有红色像素的 ARGB_8888 颜色编码位图中解压缩样本像素时,我正在使用:

    final int r = (p >> 16) & 0xff;
    final int g = (p >> 8) & 0xff;
    final int b = p & 0xff;

这确实为我返回了每种颜色的正确值。

我的意思是,是文档错误还是我遗漏了什么?

标签: androidcolorsbit-manipulationpixel

解决方案


是的,您是正确的,文档是错误的。如果您查看Color.java的Android 源代码,它是通过第二种方式完成的:

* <h4>Encoding</h4>
* <p>The four components of a color int are encoded in the following way:</p>
* <pre class="prettyprint">
* int color = (A & 0xff) << 24 | (R & 0xff) << 16 | (G & 0xff) << 8 | (B & 0xff);
* </pre>

再往下……

@ColorInt
public static int argb(
        @IntRange(from = 0, to = 255) int alpha,
        @IntRange(from = 0, to = 255) int red,
        @IntRange(from = 0, to = 255) int green,
        @IntRange(from = 0, to = 255) int blue) {
    return (alpha << 24) | (red << 16) | (green << 8) | blue;
}

推荐阅读