Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中修改位图时对其进行流式处理+;_C++_Graphics_Sdl_Sdl 2 - Fatal编程技术网

C++ 在C+中修改位图时对其进行流式处理+;

C++ 在C+中修改位图时对其进行流式处理+;,c++,graphics,sdl,sdl-2,C++,Graphics,Sdl,Sdl 2,我试图做的是使用一些过程来改变位图图像的内容(尺寸和其他一切都保持不变)。当我运行一个进程来对其执行转换时,我希望在图像发生时将其并发地流式传输到我的屏幕上。因此,它基本上是没有一系列图像的视频,而是处于不同转换阶段的相同图像。 我之所以尝试这样做是因为我想使用的位图很大,所以实际上将每个状态保存为其自己的图像,然后由于内存限制而无法进行组合 我的问题是,当另一个进程修改图像时,“实时图像显示”,有没有办法用位图图像完成类似的操作?您可以直接在视频编码器中传输图像 例如,您可以使用原始PGM/P

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


我的问题是,当另一个进程修改图像时,“实时图像显示”,有没有办法用位图图像完成类似的操作?

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

例如,您可以使用原始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;
}
将生成名为
out.mp4
的视频。从标准输入(选项
-i-
)以PGM格式(
-format PGM
)的源图像创建的视频将以60fps(即
-r
)的速度播放,如果输出文件已经存在(
-y

这段代码在linux上进行了测试;要在windows上使用这种方法,还需要使用setmode(fileno(stdout),\u O\u binary)将
stdout
设置为binary more或类似的东西(我没有在windows上测试)


一种更复杂的方法是启动一个子进程,而不是使用管道,这样程序就可以使用标准输出。

如果您只是想实时查看结果,可以使用类似于翻页/双缓冲的方法

基本上:创建两个图像。图像1是“绘图缓冲区”,而图像2是“显示缓冲区”。对图像1执行绘图的某些部分。然后,将其完整内容复制到图2。继续绘制图像1,复制,绘制,复制,绘制。。。等。在每份副本前插入延迟

./video | ffmpeg -i - -r 60 -format pgm -y out.mp4