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

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

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

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

 using System.Windows.Media; Color color = (Color)ColorConverter.ConvertFromString("#FFDFD991"); 

假设您是指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") ; 

如果你不想使用ColorTranslator,你可以轻松地做到这一点:

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

颜色代码只是ARGB值的十六进制表示。

也有这个整洁的小扩展方法:

 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(); 

以下三个变体给出完全相同的颜色。 最后一个具有在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); 
  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)); } 

你可以使用下面的代码:

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

我需要将Alice Blue的阴影转换为WPF表单的背景,并发现花费比预期更长的时间找到答案:

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

如果您想用Windows Store应用程序进行操作,请按照@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)); 

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

默认情况下,根据微软,从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的回答所启发的。

 System.Drawing.Color.FromArgb(myHashCode); 

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

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

如果你的意思是.GetHashCode() HashCode,恐怕你不能回去。 哈希函数不是双向的,只能“前进”,而不能后退。

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

WPF:

 using System.Windows.Media; //hex to color Color color = (Color)ColorConverter.ConvertFromString("#7AFF7A7A"); //color to hex string hexcolor = color.ToString(); 
Interesting Posts