如何在C#中获得RGB值时获取颜色名称?

我正在创建一个应用程序来查找图像最常用的颜色,我最多得到颜色的RGB值,但如何获取颜色名称,帮助PLZ。

如注释中所述, KnownColor枚举可用于简化:

 using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Reflection; class Test { static void Main() { Color color = Color.FromArgb(255, 0, 0); Console.WriteLine(color.Name); // ffff0000 var colorLookup = Enum.GetValues(typeof(KnownValue)) .Cast() .Select(Color.FromKnownColor) .ToLookup(c => c.ToArgb()); // There are some colours with multiple entries... foreach (var namedColor in colorLookup[color.ToArgb()]) { Console.WriteLine(namedColor.Name); } } } 

原始答案

Color.FromArgb会给你一个Color ,但它永远不会有名字。 据我所知,您需要使用reflection来获取指定的颜色。

这是Cole Campbell解决方案的另一个版本,我同时正在努力…

 using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Reflection; class Test { static void Main() { Color color = Color.FromArgb(255, 0, 0); Console.WriteLine(color.Name); // ffff0000 var colorLookup = typeof(Color) .GetProperties(BindingFlags.Public | BindingFlags.Static) .Select(f => (Color) f.GetValue(null, null)) .Where(c => c.IsNamedColor) .ToLookup(c => c.ToArgb()); // There are some colours with multiple entries... foreach (var namedColor in colorLookup[color.ToArgb()]) { Console.WriteLine(namedColor.Name); } } } 

此方法使用reflection检查Color类上的预定义颜色,并将它们与作为参数传入的颜色进行比较。 这可以进一步优化,但它应该让您了解一般技术。

 private static String GetColorName(Color color) { var predefined = typeof(Color).GetProperties(BindingFlags.Public | BindingFlags.Static); var match = (from p in predefined where ((Color)p.GetValue(null, null)).ToArgb() == color.ToArgb() select (Color)p.GetValue(null, null)); if (match.Any()) return match.First().Name; return String.Empty; } 

您应该能够使用System.Drawing命名空间中的Color类,它有一个返回Color对象的静态方法FromARGB。 它有几个重载,一个允许你输入RGB值,如下所示:

 var color = Color.FromArgb(100, 5,5,5).Name; 

对于快速简单的事情,试试这个(在WPF中):

 public string GetNameOfColor(Color color) { var colorProperty = typeof(Colors).GetProperties().FirstOrDefault(p => (Color)(p.GetValue(p, null)) == color); return (colorProperty != null) ? colorProperty.Name : color.ToString(); } 

在Visual Studio 2010中, p.GetValue(p, null)是必需的。 在Visual Studio 2013+中,您只需使用p.GetValue(p)

除了简洁之外,这种技术的优点是它不需要引用System.DrawingSystem.Reflection但允许用户保留在System.Windows命名空间内,即WPF。 它确实需要引用System.Windows.Media ,如果你在WPF中使用Colors,你可能已经拥有它。 如果你像我一样,你试着不要在没有很好需要的情况下将System.Drawing添加到你的WPF应用程序中。 至于为何留在WPF名称空间内,这是一个偏好问题。 例如,请参阅WPF v / s System.Drawing上的讨论。