代码之家  ›  专栏  ›  技术社区  ›  viky

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

  •  534
  • viky  · 技术社区  · 15 年前

    #FFDFD991 )?

    我正在读一个文件,得到一个十六进制的颜色代码。我需要创建相应的 System.Windows.Media.Color

    14 回复  |  直到 7 年前
        1
  •  786
  •   Thorarin    15 年前

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

    using System.Windows.Media;
    
    Color color = (Color)ColorConverter.ConvertFromString("#FFDFD991");
    
        2
  •  584
  •   T.Todua Laurent W.    7 年前

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

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

    但是,如果您使用的是ARGB十六进制代码,则可以使用 ColorConverter

    Color col = ColorConverter.ConvertFromString("#FFDFD991") as Color;
    //or      = (Color) ColorConverter.ConvertFromString("#FFCC66") ;
    
        3
  •  129
  •   Hans Kesting    6 年前

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

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

    颜色代码只是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 :numberstyle在System.Globalization中。
    附注2 :请提供您自己的错误检查(颜色代码应为6或8个字符的十六进制值)

        4
  •  41
  •   Peter Mortensen icecrime    8 年前

    以下三种变体的颜色完全相同。最后一个好处是在VisualStudio2010 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
  •  39
  •   Jink    14 年前

    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();
    
        6
  •  15
  •   ConfusedDeer    6 年前

    我需要将十六进制颜色代码转换为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
  •  14
  •   Baddack    11 年前
        private Color FromHex(string hex)
        {
            if (hex.StartsWith("#"))
                hex = hex.Substring(1);
    
            if (hex.Length != 6) throw new Exception("Color not valid");
    
            return Color.FromArgb(
                int.Parse(hex.Substring(0, 2), System.Globalization.NumberStyles.HexNumber),
                int.Parse(hex.Substring(2, 2), System.Globalization.NumberStyles.HexNumber),
                int.Parse(hex.Substring(4, 2), System.Globalization.NumberStyles.HexNumber));
        }
    
        8
  •  11
  •   Peter Mortensen icecrime    8 年前

    您可以使用以下代码:

    Color color = System.Drawing.ColorTranslator.FromHtml("#FFDFD991");
    
        9
  •  5
  •   Peter Mortensen icecrime    8 年前

        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));
    
        10
  •  4
  •   Justin    11 年前

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

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

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

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

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

    这是受到汉斯·凯斯汀的回答的启发。

        11
  •  1
  •   Peter Mortensen icecrime    8 年前

    Silverlight/WPF sets ellipse with hexadecimal colour 对于使用十六进制值:

    your_contorl.Color = DirectCast(ColorConverter.ConvertFromString("#D8E0A627"), Color)
    
        12
  •  1
  •   Peter Mortensen icecrime    7 年前

    使用

    System.Drawing.Color.FromArgb(myHashCode);
    
        13
  •  1
  •   Khalil Youssefi    4 年前

    在asp.net中:

    color_black = (Color)new ColorConverter().ConvertFromString("#FF76B3");
    
        14
  •  0
  •   Max Truxa    11 年前

    WPF:

    using System.Windows.Media;
    
    //hex to color
    Color color = (Color)ColorConverter.ConvertFromString("#7AFF7A7A");
    
    //color to hex
    string hexcolor = color.ToString();
    
        15
  •  0
  •   Cevdet    5 年前

            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的返回值。

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

        16
  •  0
  •   MrPaulch    4 年前

    这里已经有很多答案了。

    简言之,我支持那些提议使用 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"));
        }
    

    附笔。:

    P.P.S.: 目前,错误消息的描述性不强

        17
  •  -1
  •   Peter Mortensen icecrime    7 年前

    .GetHashCode() ,恐怕你不能回去了。散列函数不是双向的,只能“前进”,不能后退。

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