将 .Net 颜色对象转换为 HEX 代码并反向转换

16

根据问题标题,我该如何将十六进制代码转换为 .Net 的 Color 对象,反过来又该如何操作?

我已经搜索了很多次,但一直找不到可行的方法。

 ColorTranslator.ToHtml(renderedChart.ForeColor)

如何返回颜色名称,例如“White”,而不是“#ffffff”!反过来做似乎会有奇怪的结果,只能有时起作用...

5个回答

28

类似于:

Color color = Color.Red;
string colorString = string.Format("#{0:X2}{1:X2}{2:X2}",
    color.R, color.G, color.B);

另一种方法略微复杂,因为#F00是一种有效的HTML颜色(表示纯红色),但仍然可以使用正则表达式实现,下面是一个小示例类:

using System;
using System.Diagnostics;
using System.Drawing;
using System.Text.RegularExpressions;
using System.Collections.Generic;

public static class HtmlColors
{
    public static string ToHtmlHexadecimal(this Color color)
    {
        return string.Format("#{0:X2}{1:X2}{2:X2}", color.R, color.G, color.B);
    }

    static Regex htmlColorRegex = new Regex(
        @"^#((?'R'[0-9a-f]{2})(?'G'[0-9a-f]{2})(?'B'[0-9a-f]{2}))"
        + @"|((?'R'[0-9a-f])(?'G'[0-9a-f])(?'B'[0-9a-f]))$",
        RegexOptions.Compiled | RegexOptions.IgnoreCase);

    public static Color FromHtmlHexadecimal(string colorString)
    {
        if (colorString == null)
        {
            throw new ArgumentNullException("colorString");
        }

        var match = htmlColorRegex.Match(colorString);
        if (!match.Success)
        {
            var msg = "The string \"{0}\" doesn't represent"
            msg += "a valid HTML hexadecimal color";
            msg = string.Format(msg, colorString);

            throw new ArgumentException(msg,
                "colorString");
        }

        return Color.FromArgb(
            ColorComponentToValue(match.Groups["R"].Value),
            ColorComponentToValue(match.Groups["G"].Value),
            ColorComponentToValue(match.Groups["B"].Value));
    }

    static int ColorComponentToValue(string component)
    {
        Debug.Assert(component != null);
        Debug.Assert(component.Length > 0);
        Debug.Assert(component.Length <= 2);

        if (component.Length == 1)
        {
            component += component;
        }

        return int.Parse(component,
            System.Globalization.NumberStyles.HexNumber);
    }
}

用法:

// Display #FF0000
Console.WriteLine(Color.Red.ToHtmlHexadecimal());

// Display #00FF00
Console.WriteLine(HtmlColors.FromHtmlHexadecimal("#0F0").ToHtmlHexadecimal());

// Display #FAF0FE
Console.WriteLine(HtmlColors.FromHtmlHexadecimal("#FAF0FE").ToHtmlHexadecimal());

这似乎有些过度,考虑到原帖作者使用的方法已经能够满足他们的需求。 - Andrew Hare
2
无论是否为有效的HTML颜色,我都需要HEX代码。因此,我需要白色的Hex代码,而不是“白色”。 - Damien
这就是为什么我没有发布完整的解析器,因为我不知道OP需要什么...他似乎拒绝使用颜色名称,原因很奇怪...而且我所知道的API都不能像HTML那样进行“颜色转换,但从不使用标准颜色名称”。 - Julien Roncaglia
1
我需要使用十六进制代码来设置jQuery插件中的颜色。该插件使用十六进制来设置值。抱歉之前没有提到。 - Damien

12

"White" 一个有效的 HTML 颜色。请参见 ColorTranslator.ToHtml

此方法将 Color 结构转换为 HTML 颜色的字符串表示形式。这是颜色的通用名称,例如 "Red"、"Blue" 或 "Green",而不是数字颜色值的字符串表示形式,例如 "FF33AA"。

如果您的颜色无法映射到 HTML 颜色字符串,则此方法将返回颜色的有效十六进制值。请参考以下示例:

using System;
using System.Drawing;

class Program
{
    static void Main()
    {
        Console.WriteLine(ColorTranslator.ToHtml(Color.White));
        Console.WriteLine(ColorTranslator.ToHtml(Color.FromArgb(32,67,89)));
    }
}

这是正确的答案,应该有更多的赞成票。 - maguy

1

我已经编写了自己的 .net 扩展程序,用于简单地进行十六进制和整数(ARGB)之间的转换,并且反之亦然:

Imports System.Drawing
Imports System.Runtime.CompilerServices

Public Module ColorsExt

    Private Sub example_for_usage()
        Dim hex As String
        Dim c As Color = Color.Red
        hex = c.ToHexString() 'Converts color to hexadecimal string'
        c = hex.ToIntegerFromHex().ToColor() 'Gets Integer value from the hex string and simply convert it to Color()'
    End Sub

    <Extension> _
    Public Function ToColor(ByVal argb As Integer) As Color
        Return Color.FromArgb(argb)
    End Function

    <Extension> _
    Public Function ToIntegerFromHex(ByVal argb_hex_string As String) As Integer
        Return Int("&H" + argb_hex_string)
    End Function

    <Extension> _
    Public Function ToHexString(ByVal c As Color) As String
        Return String.Format("{0:X2}{1:X2}{2:X2}{3:X2}", c.A, c.R, c.G, c.B)
    End Function

    <Extension> _
    Public Sub FromHexString(ByVal c As Color, ByVal hex As String)
        c = hex.ToIntegerFromHex().ToColor()
    End Sub

    <Extension> _
    Public Function ToHexString(ByVal c As Integer) As String
        Return String.Format("{0:X8}", c)
    End Function

    <Extension> _
    Public Function ToArgb(ByVal c As Color) As Integer
        Return (c.A * &HFF0000) + (c.R * &HFF00) + (c.G * &HFF) + (c.B)
    End Function

End Module

1
如果您使用 {ColorTranslator.FromHTML} 将颜色转换回来,'White' 是 HTML 颜色的有效字符串。但我发现,如果它不是常见的字符串(例如,它可以与 White 和 #FFFFFF 一起使用,但不能与 #White 或 FFFFFF 一起使用),则此实现需要在表示颜色的字符串之前加上 # 符号。 因此,我尝试将转换放入 try/catch 块中,将 '#' 添加到字符串中进行转换,如果它抛出异常,则捕获它并进行不带 # 的转换。

-4

1
ToArgb() 返回的是一个 int,而不是十六进制字符串。试图将 int 转换为十六进制字符串会导致截断。例如,绿色最终会变成 "FF00" 而不是 "00FF00"。许多浏览器会将其解释为缩写形式的 "FFFF0000",从而得到红色。 - JDB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接