Android - преобразование байтового массива rgb_565 в массив argb или rgb - PullRequest
4 голосов
/ 12 января 2010

У меня есть данные Picture в байтовом массиве rgb_565, и я хочу преобразовать их продуктивно в массив argb. Прямо сейчас я нашел только один (немного медленный) способ сделать это:

Bitmap mPhotoPicture = BitmapFactory.decodeByteArray(imageData, 0 , imageData.length);

, где imageData - это мой byte[] массив в rgb_565, а затем:

int pixels[] = new int[CameraView.PICTURE_HEIGHT*CameraView.PICTURE_WIDTH];
mPhotoPicture.getPixels(pixels, 0,PICTURE_WIDTH, 0, 0, PICTURE_WIDTH, PICTURE_HEIGHT);

Суть в том, что я считаю, что создание Bitmap объекта является требовательным и не обязательным в этом случае. Есть ли еще какой-нибудь более быстрый способ конвертировать массив rgb_565 в массив argb?

Мне это нужно, потому что процесс обработки изображений в массиве rgb_565 выглядит немного раздражающим. А может это не так сложно?

1 Ответ

6 голосов
/ 12 января 2010

Почему бы тебе не сделать это вручную? Стол в моем опыте самый быстрый:

C-код:

static unsigned char rb_table[32];
static unsigned char g_table[64];

void init (void)
{
  // precalculate conversion tables:
  int i;
  for (i=0; i<32; i++)
    rb_table[i] = 255*i/31;
  for (i=0; i<64; i++)
    g_table[i] = 255*i/63;
}


void convert (unsigned int * dest, unsigned short * src, int n)
{
  // do bulk data conversion from 565 to rgb32
  int i;

  for (i=0; i<n; i++)
  {
    unsigned short color = src[i];

    unsigned int red   = rb_table[(color>>11)&31]<<16;
    unsigned int green = g_table[(color>>5)&63]<<8;
    unsigned int blue  = rb_table[color&31];

    dest[i] = red|green|blue;
  }
}
...