这里的两个答案都没有提到TruecolorANSI support 8bpc 颜色。这将获得 OP 最初要求的 RGB 颜色。
使用 ;2 代替 ;5,并指定 R、G 和 B 值 (0-255)在以下三个控制段中。
\x1b[38;2;40;177;249m
测试if your terminal supports Truecolor:
printf "\x1b[38;2;40;177;249mTRUECOLOR\x1b[0m\n"
在我的机器上,XTerm 愉快地输出了正确的颜色;但是,以现代 RGB 颜色之前的终端为模型的终端通常不支持真彩色 - 在使用转义码的这种特殊变体之前,请确保您知道您的目标。
我还想指出 38 和 ;5/;2 - Blue Ice mentioned 38 路由,然后 5 改变颜色。这有点不正确。
38是xterm-256扩展前景色代码; 30-37 只是 16 色前景代码(在某些系统上,亮度由转义代码 1 和可论证支持的 90-97 非标准“明亮”代码控制)所有兼容 vt100/xterm 的彩色终端都支持。
;2 和 ;5 表示颜色的格式,最终告诉终端还要拉多少序列:;5 指定 8 位格式(如 Blue Ice 所述),只需要多 1 个控制段, 和 ;2 指定需要 3 个控制段的完整 24 位 RGB 格式。
这些扩展模式在技术上是“未记录的”并且完全由实现定义。据我所知并可以研究,它们不受 ANSI 委员会管辖。
对于这种倾向,5;(256 色)格式以 16 种原始颜色(深色/浅色,因此 30-37 和 90-97)作为颜色 0-15 开始。
前面的 216 种颜色 (16-231) 由偏移 16 的 3bpc RGB 值组成,打包成一个值。
最后的 24 种颜色 (232-256) 为灰度,从比黑色稍浅的阴影开始,到比白色稍暗的阴影。一些模拟器将这些步骤解释为所有三个通道上 (256 / 24) 的线性增量,尽管我遇到了一些似乎明确定义这些值的模拟器。
这是一个执行这种转换的 Javascript 函数,它考虑了所有的灰色。
function rgbToAnsi256(r, g, b) {
// we use the extended greyscale palette here, with the exception of
// black and white. normal palette only has 4 greyscale shades.
if (r === g && g === b) {
if (r < 8) {
return 16;
}
if (r > 248) {
return 231;
}
return Math.round(((r - 8) / 247) * 24) + 232;
}
var ansi = 16
+ (36 * Math.round(r / 255 * 5))
+ (6 * Math.round(g / 255 * 5))
+ Math.round(b / 255 * 5);
return ansi;
}
因此,在某种程度上,您可以通过将初始 RGB 值从 8 位减少到 3 位来calculate 256 ANSI 颜色,以便在您想以编程方式在不支持的终端上执行此操作时形成 256 编码值。支持真彩色。