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

我正在读取一个文件,并得到一个十六进制的颜色代码。我需要为十六进制颜色代码创建相应的System.Windows.Media.Color实例。框架中是否有一个内置的方法来做到这一点?


当前回答

我在我的项目中使用了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的返回值。

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

其他回答

你可以看到Silverlight/WPF用十六进制的颜色设置椭圆来使用十六进制值:

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

我猜这是ARGB代码…你指的是system。drawing。color还是system。windows。media。color ?例如,后者在WPF中使用。我还没见过有人提到它,所以以防你在找它:

using System.Windows.Media;

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

我在我的项目中使用了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的返回值。

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

如果你想用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));

这里已经有很多答案了。

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

我知道有些人想避免System. windows . media,所以有另一个解决方案,因为你想有一个System. drawing . color,你应该有一个对System的引用。绘图已经在您的项目中。

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

一个更完整的本地解决方案

因此,如果出于某种原因你想避免System.Drawing.ColorTranslator并创建自己的实现,你至少应该让它符合规范

所以这是一个解决方案,做#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。全球化我相信你会找到一个代码剪辑解析十六进制符号。

测试

    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"));
    }

注: 可以随意删除这些参数,它们只是想说明如何调整函数来处理格式错误和默认值。

最大功率。 目前错误消息不是很有描述性