Пытаясь понять Bitmap.Config.ARBG_8888 - PullRequest
2 голосов
/ 01 июля 2019

Я пытаюсь понять упаковку цветных байтов для формата 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;

Который действительно возвращает мне правильные значения для каждого цвета.

Суть в том, что документация неправильная или я что-то упустил?

1 Ответ

1 голос
/ 02 июля 2019

Да, вы правы, а документация неверна.Если вы посмотрите на исходный код Android для Color.java, то это будет сделано следующим образом:

<code>* <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);
* 

и далее ...

@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;
}
...