2人参与 • 2026-09-18 • C/C++
上期我们聊了 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) 精确控制,公式是:
每次手动拼字符串太麻烦,封装成函数最省事。
#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;
}
bg 默认为 false(文字色),设为 true 就是背景色。reset(),否则后续输出会“继承”颜色。| 常见问题 | 解决方法 |
|---|---|
| 终端不支持真彩色(老 windows cmd) | 换用 windows terminal、powershell 7+,或 linux/macos 自带终端。 |
| windows 下输出乱码 | 程序开头必须开启 vt 模式(见上期文章)。 |
| 重定向到文件出现乱码 | 用 isatty() 判断,非终端环境就别输出转义码。 |
| 只想重置颜色,保留粗体/下划线 | 用 \033[39m(前景)或 \033[49m(背景)代替 \033[0m。 |
| 对比项 | 基础 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真彩色函数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论