在 C++ 中修改位图时流式传输位图

dvd*_*280 5 c++ graphics sdl sdl-2

我想做的是使用一些过程来改变位图图像的内容(尺寸和其他所有内容保持不变)。当我运行一个进程来对其执行转换时,我想同时将图像流式传输到我的屏幕上。所以它基本上是没有一系列图像的视频,而是处于不同转换阶段的同一图像。我尝试这样做是因为我想要执行此操作的位图很大,因此实际上将每个状态保存为其自己的图像,然后由于内存限制而无法进行组合。

我的问题是关于“实时图像显示”,而另一个进程修改图像,有没有什么方法可以用位图图像来完成这样的事情?

650*_*502 4

您可以直接在视频编码器中流式传输图像。

例如,您可以使用ffmpeg原始 PGM/PPM 图像作为输入,然后您将获得压缩视频作为输出,而无需在磁盘上创建实际图像。

编写 PGM 或 PPM 图像意味着只需生成几个标头字节,后跟实际像素值,因此对于任何语言来说都是微不足道的,不需要任何图像库。例如:

#include <stdio.h>
#include <math.h>
#include <algorithm>

int main(int argc, const char *argv[]) {
    int w = 1920, h = 1080;
    for (int frame=0; frame<100; frame++) {
        // output frame header
        printf("P5\n%i %i 255\n", w, h);
        for (int y=0; y<h; y++) {
            for (int x=0; x<w; x++) {
                double dx = (x - w/2),
                       dy = (y - h/2),
                       d = sqrt(dx*dx + dy*dy),
                       a = atan2(dy, dx) - frame*2*3.14159265359/100,
                       value = 127 + 127*sin(a+d/10);
                // output pixel
                putchar(std::max(0, std::min(255, int(value))));
            }
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在标准输出上生成可以直接组合在视频中的图像序列。运行程序

./video | ffmpeg -i - -r 60 -format pgm -y out.mp4
Run Code Online (Sandbox Code Playgroud)

将生成一个名为 的视频out.mp4。视频将以 60fps(实际用途)从标准输入(选项)-r的 PGM 格式 ( ) 源图像创建,并覆盖输出文件(如果已存在) ( )。-format pgm-i --y

这段代码在linux上测试过;为了使这种方法在 Windows 上工作,您还需要将其设置stdout为二进制 more_setmode(fileno(stdout), _O_BINARY);或类似的东西(我没有在 Windows 上进行测试)。

实现基本相同的更复杂的方法是启动子进程而不是使用管道,从而使程序可以使用标准输出。