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