如何将16位RGB帧缓冲区转换为可查看格式?

5
我正在使用别人的代码处理一个设备上的图像,可以将其放置在/dev/fb/0中并显示在视频输出上或通过网络发送到客户端应用程序。
我无法访问客户端应用程序的旧源代码,但我了解以下数据:
720x480
16位
RGB(我不确定是5,5,5还是5,6,5)
RAW(没有任何头文件)
可以使用cat命令连接到/dev/fb/0 675kb
如何给它加上头文件或将其转换为JPEG、BMP或原始类型,以便在桌面应用程序中查看?
最终,我希望它成为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

你的工作成功了吗?意思是,你能够将帧缓冲区的原始数据以视频格式发送到服务器了吗? - user370305
我能够做出自己的动态JPEG。在弄清楚这一切的过程中,我使用的脚本在此处可用:https://github.com/coolaj86/image-examples - coolaj86
嗨,感谢您的回复和帮助。此外,当我尝试获取高清设备的帧缓冲数据时,它会给我提供32位深度的原始数据,那么我该如何将其转换为适当的图像以便查看呢? - user370305
看一下这两个:https://github.com/coolaj86/image-examples/blob/master/scripts/rgbtools-fromrgbhttps://github.com/coolaj86/image-examples/blob/master/scripts/rgb24tojpeg如果你能找到ffmpeg中对应的名称,就可以相应地进行调整。 - coolaj86
它可能看起来像这样:ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt rgb32 -s 2073600 -i data.raw -f image2 -vcodec mjpeg frame.jpeg - coolaj86
2个回答

5

RGB转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
我正在开发一个嵌入式系统,使用5:6:5 RGB格式。有时我需要捕获原始帧缓冲区数据并将其转换为可视图像。为了进行实验,我编写了一些C代码来将原始二进制值转换为可读的链接文本。这种格式很简单,但易于阅读 - 因此我觉得它很方便用于操作。然后我使用Imagemagick的显示命令查看并使用转换命令将其转换为JPG格式。(如果我没记错的话,convert可以接受原始二进制图像 - 但这需要您知道所有图像参数,例如5:6:5与5:5:5之间的区别)。
如果需要,我可以发布样本C代码以将5:6:5转换为8:8:8 RGB。

现在我正在谷歌上搜索有关转换的内容,如果您能提供帮助,我将不胜感激。 - coolaj86
对于每个像素,执行以下操作: 从输入文件中读入一个unsigned short类型的pixel。 从pixel中分离红、绿、蓝3种颜色的值。 增强红、绿、蓝3种颜色的强度。 将rgb值以空格分隔的形式写入输出文件。 - Throwback1986
糟糕 - 我忘记了注释不能格式化。上面的代码假定为565像素。这段代码从二进制文件中读取一个像素,将像素值分离成RGB组件,适当地进行缩放,然后将它们作为文本写出。 - Throwback1986
你知道我怎样用convert指定RGB为5:6:5吗? - coolaj86

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接