Формат RGB565 и связанные с ним проблемы
Сенсоры поддерживают разные форматы вывода: Raw RGB Bayer, YUV, JPEG, RGB565, RGB555, RGB444 и др. В режиме предпросмотра предпочтителен вывод RGB, а в режиме съёмки формат можно сменить. ЖК-экран на плате-шилде ArduCAM поддерживает только формат RGB565, поэтому для предпросмотра на экране сенсор нужно настроить на вывод в RGB565. Тогда шилд ArduCAM выводит изображение с сенсора прямо на ЖК-экран без участия платы Arduino.
В этом случае данные пикселей с сенсора идут в формате RGB565: один пиксель занимает два последовательных байта, первый байт — R[4:0]G[5:3], второй — G[2:0]B[4:0]. На рисунке ниже — временная диаграмма вывода RGB565 и порядок данных.

Если при сохранении в файл байты поменяются местами, цвета будут неправильными. Один и тот же кадр с разным порядком байтов сохранится как разные изображения.


Иногда порядок последовательных байтов в начале строчного сигнала HREF (Line_valid) неизвестен. Чтобы обойти эту проблему, примеры скетчей ArduCAM перед сохранением в файл считывают из FIFO первый фиктивный байт и так выравнивают порядок байтов.
//Write the BMP header
for( i = 0; i < BMPIMAGEOFFSET; i++)
{
char ch = pgm_read_byte(&bmp_header[i]);
buf[k++] = ch;
}
outFile.write(buf,k);
//Read first dummy byte
//myCAM.read_fifo();
k = 0;
//Read 320x240x2 byte from FIFO
//Save as RGB565 bmp format
for(i = 0; i < 240; i++)
for(j = 0; j < 320; j++)
{
VH = myCAM.read_fifo();
VL = myCAM.read_fifo();
buf[k++] = VL;
buf[k++] = VH;
//Write image data to bufer if not full
if(k >= 256)
{
//Write 256 bytes image data to file from buffer
outFile.write(buf,256);
k = 0;
}
}

