上期我们聊了 system("color")、setconsoletextattribute 和基础 ansi 转义码,今天单独拎出 ansi 里最实用的 真彩色(true color) 玩法——直接传 rgb,想要什么颜色就有什么颜色。
一、为什么还要专门写个函数?
基础 ansi 码只支持 16 种颜色(30~37 / 90~97),虽然够用,但想调个橙红、粉紫、蒂芙尼蓝就抓瞎了。
真彩色(24-bit)允许你用 r(0~255) g(0~255) b(0~255) 精确控制,公式是:
- 前景色:\033[38;2;r;g;bm
- 背景色:\033[48;2;r;g;bm
每次手动拼字符串太麻烦,封装成函数最省事。
二、核心函数(直接复制就能用)
#include <string>
std::string rgb(int r, int g, int b, bool bg = false) {
// 防手滑越界
if (r < 0) r = 0; if (r > 255) r = 255;
if (g < 0) g = 0; if (g > 255) g = 255;
if (b < 0) b = 0; if (b > 255) b = 255;
int prefix = bg ? 48 : 38; // 48=背景,38=前景
return "\033[" + std::to_string(prefix) + ";2;" +
std::to_string(r) + ";" +
std::to_string(g) + ";" +
std::to_string(b) + "m";
}
// 顺手一个重置
inline std::string reset() { return "\033[0m"; }
三、怎么用?三步走
#include <iostream>
int main() {
// 1. 设置文字颜色(橙红)
std::cout << rgb(255, 100, 50) << "这行是橙红色" << reset() << std::endl;
// 2. 设置背景色(天蓝)
std::cout << rgb(0, 150, 255, true) << " 蓝底白字 " << reset() << std::endl;
// 3. 同时设前景和背景(黄字黑底)
std::cout << rgb(255, 255, 0) << rgb(0, 0, 0, true)
<< "黄字黑底" << reset() << std::endl;
return 0;
}
- 前三个参数是 rgb,范围 0~255。
- 第四个参数
bg默认为false(文字色),设为true就是背景色。 - 每段颜色输出后记得调用
reset(),否则后续输出会“继承”颜色。
四、几个避坑提醒
| 常见问题 | 解决方法 |
|---|---|
| 终端不支持真彩色(老 windows cmd) | 换用 windows terminal、powershell 7+,或 linux/macos 自带终端。 |
| windows 下输出乱码 | 程序开头必须开启 vt 模式(见上期文章)。 |
| 重定向到文件出现乱码 | 用 isatty() 判断,非终端环境就别输出转义码。 |
| 只想重置颜色,保留粗体/下划线 | 用 \033[39m(前景)或 \033[49m(背景)代替 \033[0m。 |
五、和基础 ansi 比,好在哪?
| 对比项 | 基础 ansi(16色) | 真彩色(rgb) |
|---|---|---|
| 颜色数量 | 固定 16 种 | 1670 万种(任意 rgb) |
| 语法 | \033[31m | \033[38;2;r;g;bm |
| 兼容性 | 几乎所有终端 | 需要较新终端(win10+ / linux / macos) |
| 适用场景 | 通用、老旧环境 | 追求美观、个性化输出 |
六、完整测试代码
把上面的函数和 main 合在一起,就是一份可直接编译运行的完整例子:
#include <iostream>
#include <string>
std::string rgb(int r, int g, int b, bool bg = false) {
if (r < 0) r = 0; if (r > 255) r = 255;
if (g < 0) g = 0; if (g > 255) g = 255;
if (b < 0) b = 0; if (b > 255) b = 255;
int prefix = bg ? 48 : 38;
return "\033[" + std::to_string(prefix) + ";2;" +
std::to_string(r) + ";" +
std::to_string(g) + ";" +
std::to_string(b) + "m";
}
inline std::string reset() { return "\033[0m"; }
int main() {
std::cout << rgb(255, 80, 80) << "红色警告" << reset() << std::endl;
std::cout << rgb(80, 255, 80) << "绿色成功" << reset() << std::endl;
std::cout << rgb(255, 255, 80) << "黄色提示" << reset() << std::endl;
std::cout << rgb(255, 165, 0) << "橙色自定义" << reset() << std::endl;
std::cout << rgb(0, 0, 0, true) << rgb(255, 255, 255)
<< "黑底白字" << reset() << std::endl;
return 0;
}
小结
这个函数只有短短几行,却让你彻底告别 16 色限制。配合上期的基础知识,现在你可以在 windows/linux/macos 下自由调配控制台色彩了。
如果终端不支持,别慌——换 windows terminal 或直接用 linux,效果立竿见影。
到此这篇关于c++ ansi真彩色函数的实现的文章就介绍到这了,更多相关c++ ansi真彩色函数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论