gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:15:54 26 4
gpt4 key购买 nike

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

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

最佳答案

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

例如,您可以输入 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;
}

在标准输出上生成一系列可以直接组合到视频中的图像。运行程序
./video | ffmpeg -i - -r 60 -format pgm -y out.mp4

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

此代码已在 linux 上测试;要在 Windows 上使用这种方法,您还需要设置 stdout使用 _setmode(fileno(stdout), _O_BINARY); 二进制更多或类似的东西(我没有在 Windows 上测试)。

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

关于c++ - 在 C++ 中修改位图时流式传输位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62127799/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com