Как создать пиксельное значение ARGB_8888? - PullRequest
1 голос
/ 23 ноября 2011

Скажем, я хочу создать массив значений пикселей для передачи в метод createBitmap, описанный здесь . У меня есть три значения типа int r, g, b в диапазоне 0 - 0xff. Как мне превратить их в непрозрачный пиксель p?

Идет ли альфа-канал в старшем или младшем байте?

Я погуглил документацию , но в ней говорится только:

Каждый пиксель хранится в 4 байтах. Каждый канал (RGB и альфа для полупрозрачность) сохраняется с точностью до 8 бит (256 возможных) значения.) Эта конфигурация очень гибкая и предлагает лучшее качественный. Его следует использовать всегда, когда это возможно.

Итак, как написать этот метод?

int createPixel(int r, int g, int b)
{
  return ?
}

Ответы [ 4 ]

11 голосов
/ 23 ноября 2011

Похоже, что Формат пикселей RGBA довольно хорошо задокументирован, и я предполагаю, что это означает, что документы для Android, просто используя другое имя, чтобы соответствовать позиции членства канала в битовом поле:*

enter image description here

Примерно так должно работать:

int createPixel(int r, int g, int b) {
  return createPixel(r, g, b, 0xff);
}

int createPixel(int r, int g, int b, int a) {
  return (a<<24) | (r<<16) | (g<<8) | b;
}

Кроме того, вы можете использовать byte вместо int, чтобы избежать переполненияошибки или маскируйте только те биты, которые вам нужны:

int createPixel(int r, int g, int b, int a) {
  return ((a & 0xff) << 24)
       | ((r & 0xff) << 16)
       | ((g & 0xff) << 8)
       | ((b & 0xff));
}

Хотя ограничение значений на [0,255] может иметь больше смысла.

6 голосов
/ 23 ноября 2011

С документы :

(alpha << 24) | (red << 16) | (green << 8) | blue
1 голос
/ 23 ноября 2011

Это должно работать:

int createPixel(int r, int g, int b)
{
    return 0xff000000 | (r << 16) | (g << 8) | b;
}

или, если вы хотите быть барокко:

int createPixel(int r, int g, int b)
{
    return (((((-1 << 8) | r) << 8) | g) << 8) | b;
}
1 голос
/ 23 ноября 2011

Прежде всего, ваши аргументы должны быть байтами, а не целыми числами, но я думаю, это может быть проблемой реализации.

В общем, вы бы сделали что-то вроде

return b | r<<8 | g<<16 | 255<<24;

при условии, что ваша альфа 255 (непрозрачная).

...