You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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编码分三个区间,需分别处理转换逻辑:

  1. 0-15:与标准16色对应,复用上述映射表
  2. 16-231:6×6×6的RGB立方体,每个通道取值为0/51/102/153/204/255
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:20:28