Конвертировать RGB565 в оттенки серого (8 бит) - PullRequest
3 голосов
/ 23 июня 2011

Я пытаюсь преобразовать изображение rgb565 (видеопоток с камеры телефона Android) в изображение в оттенках серого (8 бит).

До сих пор я получил следующий код (преобразование вычисляется в нативном формате).код с использованием Android NDK).Обратите внимание, что мое входное изображение имеет размер 640 * 480, и я хочу обрезать его, чтобы оно поместилось в буфере 128 * 128.

#define RED(a)      ((((a) & 0xf800) >> 11) << 3)
#define GREEN(a)    ((((a) & 0x07e0) >> 5) << 2)
#define BLUE(a)     (((a) & 0x001f) << 3)

typedef unsigned char byte;

void toGreyscale(byte *rgbs, int widthIn, int heightIn, byte *greyscales)
{
    const int textSize = 128;
    int x,y;
    short* rgbPtr = (short*)rgbs;
    byte *greyPtr = greyscales;

    // rgbs arrives in RGB565 (16 bits) format
    for (y=0; y<textSize; y++)
    {
        for (x=0; x<textSize; x++)
        {
            short pixel = *(rgbPtr++);
            int r = RED(pixel);
            int g = GREEN(pixel);
            int b = BLUE(pixel);

            *(greyPtr++) = (byte)((r+g+b) / 3);
        }
        rgbPtr += widthIn - textSize;
    }
}

Изображение отправляется в функцию, подобную этой

jbyte* cImageIn = env->GetByteArrayElements(imageIn, &b);
jbyte* cImageOut = (jbyte*)env->GetDirectBufferAddress(imageOut);
toGreyscale((byte*)cImageIn, widthIn, heightIn, (byte*)cImageOut);

Результат, который я получаю, - это изображение с перевернутым по горизонтали (понятия не имею, почему ... UV для отображения результата верны ...), но самая большая проблема заключается в том, что только красный канал на самом деле корректен, когда я их отображаюпо отдельности.Зеленый и синий каналы все перепутаны, и я понятия не имею, почему.Я проверил в Интернете, и все ресурсы, которые я нашел, показали, что маски, которые я использую, являются правильными.Любая идея, где ошибка может быть?

Спасибо!

1 Ответ

0 голосов
/ 28 июня 2011

Может быть проблема с порядком байтов?

Вы можете быстро проверить, поменяв два байта 16-битного слова перед удалением компонентов RGB.

...