如何实现ANSI颜色与RGB/HEX的互转?(Dart语言)
将ANSI颜色编码转换为RGB/HEX(Dart实现)
一、标准16色ANSI编码转换
ANSI 16色包含基础色(30-37/40-47)和亮色(90-97/100-107),对应的RGB值固定,可通过映射表直接转换:
// 标准ANSI颜色到RGB的映射(key为ANSI颜色码,value为RGB三元组) const Map<int, List<int>> ansi16ToRgb = { 30: [0, 0, 0], // 黑(前景) 31: [205, 0, 0], // 红(前景) 32: [0, 205, 0], // 绿(前景) 33: [205, 205, 0], // 黄(前景) 34: [0, 0, 238], // 蓝(前景) 35: [205, 0, 205], // 紫(前景) 36: [0, 205, 205], // 青(前景) 37: [229, 229, 229],// 白(前景) 90: [127, 127, 127],// 亮黑(前景) 91: [255, 0, 0], // 亮红(前景) 92: [0, 255, 0], // 亮绿(前景) 93: [255, 255, 0], // 亮黄(前景) 94: [92, 92, 255], // 亮蓝(前景) 95: [255, 0, 255], // 亮紫(前景) 96: [0, 255, 255], // 亮青(前景) 97: [255, 255, 255],// 亮白(前景) // 背景色RGB值与对应前景色一致,仅用途不同 40: [0, 0, 0], 41: [205, 0, 0], 42: [0, 205, 0], // 其余背景色可按此逻辑补充 }; // 转换函数:输入ANSI码,返回RGB三元组或null(无效码值) List<int>? convertAnsi16ToRgb(int ansiCode) { return ansi16ToRgb[ansiCode]; }
二、256色ANSI编码转换
256色ANSI编码分三个区间,需分别处理转换逻辑:
- 0-15:与标准16色对应,复用上述映射表
- 16-231:6×6×6的RGB立方体,每个通道取值为0/51/102/153/204/255
- 232-255:24级灰度阶,从黑(8)到白(238),步长为10
List<int>? convertAnsi256ToRgb(int ansiCode) { // 0-15 复用16色映射 if (ansiCode >= 0 && ansiCode <= 15) { return ansi16ToRgb[ansiCode] ?? ansi16ToRgb[ansiCode + 30]; } // 16-231:RGB立方体计算 if (ansiCode >= 16 && ansiCode <= 231) { final code = ansiCode - 16; final r = (code ~/ 36) * 51; final g = ((code ~/ 6) % 6) * 51; final b = (code % 6) * 51; return [r, g, b]; } // 232-255:灰度阶计算 if (ansiCode >= 232 && ansiCode <= 255) { final gray = 8 + (ansiCode - 232) * 10; return [gray, gray, gray]; } return null; }
三、RGB转HEX格式
得到RGB三元组后,可直接转换为HEX字符串:
String rgbToHex(List<int> rgb) { return '#${rgb[0].toRadixString(16).padLeft(2, '0')}' '${rgb[1].toRadixString(16).padLeft(2, '0')}' '${rgb[2].toRadixString(16).padLeft(2, '0')}'; }
示例使用
void main() { // 转换标准ANSI红(31) final rgb1 = convertAnsi16ToRgb(31); if (rgb1 != null) { print('ANSI 31 的RGB:$rgb1,HEX:${rgbToHex(rgb1)}'); // 输出:ANSI 31 的RGB:[205, 0, 0],HEX:#cd0000 } // 转换256色中的青(45) final rgb2 = convertAnsi256ToRgb(45); if (rgb2 != null) { print('ANSI 45 的RGB:$rgb2,HEX:${rgbToHex(rgb2)}'); // 输出:ANSI 45 的RGB:[0, 204, 204],HEX:#00cccc } }
内容的提问来源于stack exchange,提问作者Stanisalv ilin
相关产品推荐
相关产品推荐

