<p>用 ColorTranslator.FromHtml() 最省事,它支持 "#FF00FF"、"#F0F"、"ff00ff" 等格式,自动兼容大小写和 # 符号,但不支持 rgb() 或 hsl();需注意 Alpha 处理差异及静默失败风险。</p>

十六进制颜色字符串怎么转 Color 对象(C#)
直接用 ColorTranslator.FromHtml() 最省事,它原生支持 "#FF00FF"、"#F0F"、"ff00ff" 等常见格式,连大小写和是否带 # 都自动兼容。
常见错误是手动拆字符串再调 Convert.ToInt32(x, 16) —— 容易漏处理缩写(如 "#F0F"),也容易在没 # 时抛 FormatException。
- 必须确保输入非空且长度合法(3、4、6、8 位),否则
FromHtml()会返回Color.Empty而不报错 - 它不支持
rgb(255, 0, 255)或hsl()格式,只认 HTML 颜色关键词("red")和十六进制 - 如果需要 Alpha 通道,用 8 位格式(如
"#FF00FF80"),但注意 WPF 和 WinForms 对 Alpha 的解释略有差异:WinForms 默认忽略 Alpha,WPF 会保留
示例:
var c = ColorTranslator.FromHtml("#F0F"); // 等价于 #FF00FF
解析网页色彩代码时遇到透明度怎么处理
网页里常见的 "#RGBA"(4 位)或 "#RRGGBBAA"(8 位)会被 ColorTranslator.FromHtml() 正确读取 Alpha 值,但 WinForms 控件(如 Label.ForeColor)默认不渲染 Alpha —— 不是转换错了,是显示层没用它。
真正要用透明度,得确认目标场景支持:WPF 的 Brush、UWP 的 Color、或 GDI+ 绘图时显式传入 Color.FromArgb()。
- 别依赖
c.A为 0 就代表“完全透明”——有些旧控件把 Alpha 当作无效值直接丢弃 - 若需跨平台一致行为,建议统一转成 8 位完整格式再解析,避免缩写带来的歧义(比如
"#000"是黑,"#0000"却是半透黑,但肉眼难分辨) - 遇到
"transparent"这种关键字,FromHtml()会返回Color.FromArgb(0, 0, 0, 0),可安全用于判断
为什么 ColorTranslator.FromHtml("#FF00FF") 有时返回黑色
大概率是输入字符串含不可见字符(比如复制粘贴带 BOM 或全角空格),或者用了中文引号、换行符。这个方法对格式极其敏感,但错误时不抛异常,只静默返回 Color.Black 或 Color.Empty。
- 务必先
.Trim(),再检查是否以"#"开头;如果不是,手动补上(FromHtml()要求带#或是关键词) - 别用
string.Replace(" ", "")清空格——要.Replace("\u00A0", "").Trim(),因为网页里常用不间断空格() - 调试时直接打印
input.Length和Regex.Escape(input),比猜更可靠
不想依赖 System.Drawing 怎么纯手工解析
如果项目是 .NET Core / .NET 5+ 且没引用 System.Drawing.Common(比如用在无 UI 的服务端),就得自己写解析逻辑。核心就三步:标准化字符串 → 拆分通道 → 转整数。
重点不是“怎么写”,而是“怎么防错”:缩写格式(3/4 位)必须双倍扩展("F0F" → "FF00FF"),不能简单重复字符("F0F" ≠ "FF00FF")。
- 用正则
^#?([0-9A-Fa-f]{3}|[0-9A-Fa-f]{4}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$先校验,别等ToInt32再崩 - 3 位转 6 位:每个字符重复一次(
"F"→"FF"),不是补零 - 4 位转 8 位同理,但顺序是
RRGGBBAA,别错当成AARRGGBB(那是 ARGB 内存布局,不是 HTML 格式)
示例:
var hex = "#F0F".TrimStart('#').ToLower(); // → "f0f"<br>if (hex.Length == 3) hex = string.Concat(hex.Select(c => $"{c}{c}")); // → "ff00ff"
实际用的时候,最常被忽略的是:不同 UI 框架对 Alpha 的解释不一致,以及 FromHtml() 在失败时沉默返回默认值——它不报错,你却以为颜色对了。










