我是一个对 C++ 非常感兴趣的学生,目前我正在做一个小项目,涉及在Windows Terminal上打印大量彩色ASCII字符,这是旧cmd.exe
的优化版本。我的项目包括通过将视频帧转换为ASCII图像并按顺序打印来创建小的“ASCII视频”(请参阅
或video link)。我目前使用ANSI逸出序列(例如\033[38;2;⟨r⟩;⟨g⟩;⟨b⟩m
)来手动设定每个ASCII字符的颜色,如下所示:
string char_ramp("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\" ^ `'. ");
int brightness(some_number);
(...)
current_frame += string{} + "\033[38;2;" + to_string(r) + ";" + to_string(g) + ";" + to_string(b) + "m" + char_ramp[(int)(greyscale_index / 255 * (char_ramp.size() - 1)) / brightness] + "\033[0m";
字符串
基本上,我是通过在灰度字符斜坡上添加与当前像素的亮度级别相对应的ASCII字符来逐行构建帧,然后使用ANSI转义序列对其进行着色。
但这样做对终端的要求似乎很高,因为打印彩色ASCII帧时会出现帧丢失。例如,如果原始视频为30 fps,则彩色ASCII视频将下降到大约15 fps。
我试着去除颜色,它似乎工作正常,没有框架下降。
一些朋友建议我应该直接设置缓冲区数据,而不是打印行的所有额外逻辑。但是,我不知道如何在不改变ASCII帧构造方式的情况下做到这一点,因为我确实需要以特定的方式存储它们。我听说WriteConsoleOutputCharacter
函数允许我做一些事情,但我不明白如何在中实现它我的代码。
我并不真正关心内存效率,所以有没有一种方法可以将帧数据设置到缓冲区中,然后迭代我想要显示的帧?
如果这只是一个错误的呼叫,那么在终端上显示这些ascii帧的有效方法是什么?
1条答案
按热度按时间m4pnthwp1#
不久前,我写了一些代码,直接向Windows控制台进行流样式的输出,并提供颜色支持。
字符串
属性在匹配的.cpp文件中定义:
型
这里有一个快速的演示/测试程序来展示它是如何使用的:
型
根据我的经验,这比使用ANSI转义序列要快得多(而且,尽管它的价值不大,但它也适用于旧版本的Windows)。