Как преобразовать 16-битный RGB Frame Buffer в видимый формат? - PullRequest
5 голосов
/ 23 сентября 2010

Я работаю с чужим кодом на устройстве, которое может поместить изображение в /dev/fb/0 и показать его на видео или отправить его по сети клиентскому приложению.

У меня нет доступа к старому источнику для клиентского приложения, но я знаю следующее о данных:

  • 720x480
  • 16-бит
  • RGB (я не уверен, что это 5,5,5 или 5,6,5)
  • RAW (без заголовков)
  • cat - возможно /dev/fb/0
  • 675kb

Как мне придать этому заголовку или преобразовать его в JPEG, BMP или RAW-тип, который я затем смогу просмотреть в настольном приложении?

В конечном счете, я хочу, чтобы он был в формате jpeg и просматривался в браузере, но все, что я вижу своими глазами, пока будет работать.

Успех

(см. Комментарии ниже)

ffmpeg \
  -vcodec rawvideo \
  -f rawvideo \
  -pix_fmt rgb565 \
  -s 720x480 \
  -i in-buffer.raw \
  \
  -f image2 \
  -vcodec mjpeg \
  out-buffer.jpg

Неудачные попытки

Показывает изображение три раза по ширине почти без цвета и сдавливает по вертикали:

rawtoppm -rgb -interpixel 720 480 fb.raw > fb.ppm

Показывает изображение, но с полосами и сдавленными по вертикали и плохим цветом:

rawtoppm -rgb -interrow 720 480 fb.raw > fb.ppm

аналогично вышеуказанному

convert -depth 16 -size 720x480 frame_buffer.rgb fb.jpeg

Ответы [ 2 ]

5 голосов
/ 24 сентября 2010

от pgb до ppm: просто сезон по вкусу!

поддерживается на уровне https://github.com/coolaj86/image-examples

#include <stdio.h>

int main(int argc, char* argv[]) {

  FILE* infile; // fb.raw
  FILE* outfile; // fb.ppm
  unsigned char red, green, blue; // 8-bits each
  unsigned short pixel; // 16-bits per pixel
  unsigned int maxval; // max color val
  unsigned short width, height;
  size_t i;

  infile = fopen("./fb.raw", "r");
  outfile = fopen("./fb.ppm", "wb");
  width = 720;
  height = 480;
  maxval = 255;

  // P3 - PPM "plain" header
  fprintf(outfile, "P3\n#created with rgb2ppm\n%d %d\n%d\n", width, height, maxval);

  for (i = 0; i < width * height; i += 1) {
      fread(&pixel, sizeof(unsigned short), 1, infile);

      red = (unsigned short)((pixel & 0xF800) >> 11);  // 5
      green = (unsigned short)((pixel & 0x07E0) >> 5); // 6
      blue = (unsigned short)(pixel & 0x001F);         // 5

      // Increase intensity
      red = red << 3;
      green = green << 2;
      blue = blue << 3;

    // P6 binary
    //fwrite(&(red | green | blue), 1, sizeof(unsigned short), outfile);

    // P3 "plain"
    fprintf(outfile, "%d %d %d\n", red, green, blue);
  }
}
2 голосов
/ 23 сентября 2010

Я разрабатываю встраиваемую систему с форматом 5: 6: 5 RGB, и иногда мне нужно было захватывать необработанные данные кадрового буфера и преобразовывать их в видимое изображение.Для экспериментов я написал немного кода на C, чтобы преобразовать необработанные двоичные значения в текст ссылки .Формат тупой, но легко читаемый - поэтому я нашел его удобным для взлома.Затем я использовал Imagemagick display для просмотра и convert для конвертации в JPG.(Если я правильно помню, convert будет принимать необработанные двоичные изображения - но это предполагает, что вы знаете все параметры изображения, то есть 5: 6: 5 против 5: 5: 5).

Iможет опубликовать пример кода C для преобразования RGB от 5: 6: 5 до 8: 8: 8, если это необходимо.

...