如何使用.NET从十六进制颜色代码中获取颜色?

时间:2010-01-21 14:07:51

标签: c# wpf colors hex

如何从十六进制颜色代码中获取颜色(例如#FFDFD991)?

我正在读取文件并获得十六进制颜色代码。我需要为十六进制颜色代码创建相应的System.Windows.Media.Color实例。框架中是否有内置方法来执行此操作?

16 个答案:

答案 0 :(得分:678)

我假设这是一个ARGB代码...您是指System.Drawing.Color还是System.Windows.Media.Color?例如,后者用于WPF。我还没有看到有人提到它,所以万一你正在寻找它:

using System.Windows.Media;

Color color = (Color)ColorConverter.ConvertFromString("#FFDFD991");

答案 1 :(得分:509)

假设您的意思是HTML类型的RGB代码(称为十六进制代码,例如#FFCC66),请使用ColorTranslator类:

System.Drawing.Color col = System.Drawing.ColorTranslator.FromHtml("#FFCC66");

如果您使用的是ARGB十六进制代码,则可以使用System.Windows.Media命名空间中的ColorConverter类:

Color col = ColorConverter.ConvertFromString("#FFDFD991") as Color;
//or      = (Color) ColorConverter.ConvertFromString("#FFCC66") ;

答案 2 :(得分:97)

如果您不想使用ColorTranslator,可以轻松完成:

string colorcode = "#FFFFFF00";
int argb = Int32.Parse(colorcode.Replace("#", ""), NumberStyles.HexNumber);
Color clr = Color.FromArgb(argb);

colorcode只是ARGB值的十六进制表示。

修改

如果您需要使用4个值而不是单个整数,则可以使用此值(组合多个注释):

string colorcode = "#FFFFFF00";    
colorcode = colorcode.TrimStart('#');

Color col; // from System.Drawing or System.Windows.Media
if (colorcode.Length == 6)
    col = Color.FromArgb(255, // hardcoded opaque
                int.Parse(colorcode.Substring(0,2), NumberStyles.HexNumber),
                int.Parse(colorcode.Substring(2,2), NumberStyles.HexNumber),
                int.Parse(colorcode.Substring(4,2), NumberStyles.HexNumber));
else // assuming length of 8
    col = Color.FromArgb(
                int.Parse(colorcode.Substring(0, 2), NumberStyles.HexNumber),
                int.Parse(colorcode.Substring(2, 2), NumberStyles.HexNumber),
                int.Parse(colorcode.Substring(4, 2), NumberStyles.HexNumber),
                int.Parse(colorcode.Substring(6, 2), NumberStyles.HexNumber));

注1 :NumberStyles位于System.Globalization中 注意2 :请提供您自己的错误检查(颜色代码应为6或8个字符的十六进制值)

答案 3 :(得分:37)

还有这种简洁的小扩展方法:

static class ExtensionMethods
{
    public static Color ToColor(this uint argb)
    {
        return Color.FromArgb((byte)((argb & -16777216)>> 0x18),      
                              (byte)((argb & 0xff0000)>> 0x10),   
                              (byte)((argb & 0xff00) >> 8),
                              (byte)(argb & 0xff));
    }
}

使用中:

Color color = 0xFFDFD991.ToColor();

答案 4 :(得分:36)

下面的三个变体给出了完全相同的颜色。最后一个的好处是可以在Visual Studio 2010 IDE中突出显示(可能是正在使用的ReSharper)并且颜色正确。

var cc1 = System.Drawing.ColorTranslator.FromHtml("#479DEE");

var cc2 = System.Drawing.Color.FromArgb(0x479DEE);

var cc3 = System.Drawing.Color.FromArgb(0x47, 0x9D, 0xEE);

答案 5 :(得分:11)

您可以使用以下代码:

Color color = System.Drawing.ColorTranslator.FromHtml("#FFDFD991");

答案 6 :(得分:10)

我需要将HEX颜色代码转换为System.Drawing.Color,特别是作为WPF表单背景的Alice Blue的阴影,发现找到答案需要比预期更长的时间:

using System.Windows.Media;

-

System.Drawing.Color myColor = System.Drawing.ColorTranslator.FromHtml("#EFF3F7");
this.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(myColor.A, myColor.R, myColor.G, myColor.B));

答案 7 :(得分:5)

如果您想使用Windows应用商店应用,请关注@Hans Kesting和@Jink回答:

    string colorcode = "#FFEEDDCC";
    int argb = Int32.Parse(colorcode.Replace("#", ""), NumberStyles.HexNumber);
    tData.DefaultData = Color.FromArgb((byte)((argb & -16777216) >> 0x18),
                          (byte)((argb & 0xff0000) >> 0x10),
                          (byte)((argb & 0xff00) >> 8),
                          (byte)(argb & 0xff));

答案 8 :(得分:3)

这篇文章已成为任何试图从十六进制颜色代码转换为系统颜色的人的转到。因此,我想我会添加一个处理6位(RGB)和8位(ARGB)十六进制值的综合解决方案。

默认情况下,根据Microsoft的说法,从RGB转换为ARGB值时

  

alpha值隐式为255(完全不透明)。

这意味着通过将FF添加到6位(RGB)十六进制颜色代码,它将成为8位ARGB十六进制颜色代码。因此,可以创建一个简单的方法来处理ARGB和RGB十六进制,并将它们转换为适当的Color结构。

    public static System.Drawing.Color GetColorFromHexValue(string hex)
    {
        string cleanHex = hex.Replace("0x", "").TrimStart('#');

        if (cleanHex.Length == 6)
        {
            //Affix fully opaque alpha hex value of FF (225)
            cleanHex = "FF" + cleanHex;
        }

        int argb;

        if (Int32.TryParse(cleanHex, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out argb))
        {
            return System.Drawing.Color.FromArgb(argb);
        }

        //If method hasn't returned a color yet, then there's a problem
        throw new ArgumentException("Invalid Hex value. Hex must be either an ARGB (8 digits) or RGB (6 digits)");

    }

这是受到Hans Kesting的回答的启发。

答案 9 :(得分:1)

使用

System.Drawing.Color.FromArgb(myHashCode);

答案 10 :(得分:1)

您可以看到 Silverlight/WPF sets ellipse with hexadecimal colour 使用十六进制值:

your_contorl.Color = DirectCast(ColorConverter.ConvertFromString("#D8E0A627"), Color)

答案 11 :(得分:1)

在asp.net中:

color_black = (Color)new ColorConverter().ConvertFromString("#FF76B3");

答案 12 :(得分:0)

如果你的意思是.GetHashCode()中的HashCode,我恐怕你不能回去。散列函数不是双向的,你可以只前进,而不是后退。

如果您需要根据颜色的十六进制值获取颜色,请按照Oded的建议。

答案 13 :(得分:0)

WPF:

using System.Windows.Media;

//hex to color
Color color = (Color)ColorConverter.ConvertFromString("#7AFF7A7A");

//color to hex
string hexcolor = color.ToString();

答案 14 :(得分:0)

我在项目中使用了ColorDialog。 ColorDialog有时返回“ Red”,“ Fhushia”,有时返回“ fff000”。我这样解决了这个问题,也许可以帮助别人。

        SolidBrush guideLineColor;
        if (inputColor.Any(c => char.IsDigit(c)))
        {
            string colorcode = inputColor;
            int argbInputColor = Int32.Parse(colorcode.Replace("#", ""), NumberStyles.HexNumber);
             guideLineColor = new SolidBrush(Color.FromArgb(argbInputColor));

        }
        else
        {
            Color col = Color.FromName(inputColor);
             guideLineColor = new SolidBrush(col);
        }

InputColor是ColorDialog的返回值。

感谢大家回答这个问题。这对我有很大帮助。

答案 15 :(得分:0)

这里已经有很多答案了。

简而言之,我支持那些建议使用 System.Drawing.ColorTranslator 的人。

我知道有些人想避免 System.Windows.Media,所以还有另一种解决方案,既然你想要一个 System.Drawing.Color,你应该已经在你的项目中引用了 System.Drawing .

简而言之:如果可以,使用框架

更完整的原生解决方案

因此,如果出于某种原因您想避免 System.Drawing.ColorTranslator 并创建自己的实现,您至少应该让它尊重 specifications

所以这是一个解决 #RGB#RGBA 速记 - 以及扩展颜色定义的解决方案

    public static Color ParseHtmlColor(string htmlColor) => Color.FromArgb(HtmlColorToArgb(htmlColor));

    public static int HtmlColorToArgb(string htmlColor, bool requireHexSpecified = false, int defaultAlpha = 0xFF)
    {

        if (string.IsNullOrEmpty(htmlColor))
        {
            throw new ArgumentNullException(nameof(htmlColor));
        }

        if (!htmlColor.StartsWith("#") && requireHexSpecified)
        {
            throw new ArgumentException($"Provided parameter '{htmlColor}' is not valid");
        }

        htmlColor = htmlColor.TrimStart('#');
        

        // int[] symbols 
        var symbolCount = htmlColor.Length;
        var value = int.Parse(htmlColor, System.Globalization.NumberStyles.HexNumber);
        switch (symbolCount)
        {
            case 3: // RGB short hand
            {
                return defaultAlpha << 24
                    | (value & 0xF)
                    | (value & 0xF) << 4
                    | (value & 0xF0) << 4
                    | (value & 0xF0) << 8
                    | (value & 0xF00) << 8
                    | (value & 0xF00) << 12
                    ;
            }
            case 4: // RGBA short hand
            {
                // Inline alpha swap
                return   (value & 0xF) << 24
                       | (value & 0xF) << 28
                       | (value & 0xF0) >> 4
                       | (value & 0xF0) 
                       | (value & 0xF00) 
                       | (value & 0xF00) << 4
                       | (value & 0xF000) << 4
                       | (value & 0xF000) << 8
                       ;
            }
            case 6: // RGB complete definition
            {
                return defaultAlpha << 24 | value;   
            }
            case 8: // RGBA complete definition
            {
                // Alpha swap
                return (value & 0xFF) << 24 | (value >> 8);
            }
            default:
                throw new FormatException("Invalid HTML Color");
        }
    }

如果您出于某种原因不想使用 System.Globalization,我相信您会找到一段用于解析十六进制符号的代码。

测试

    public static void TestColors()
    {
        foreach (var testCase in TestCases) TestColor(testCase);
    }

    static string[] TestCases = new string[] { 
        "111",
        "FFF", 
        "17A",
        "F52",
        "444F",
        "2348",
        "4320",
        "121212",
        "808080",
        "FFFFFF",
        "A0E0C0",
        "0A070B",
        "FFFFFFFF",
        "808080FF",
        "40807710"
    };

    public static void TestColor(string htmlColor)
    {
        Console.Write($" {htmlColor} -> ");
        var color = ParseHtmlColor(htmlColor);
        Console.WriteLine("0x" + color.ToArgb().ToString("X"));
    }

附: 随意删除参数,它们只是想展示如何调整函数以处理格式错误和默认值。

附言: 错误消息目前不是很具有描述性