如何在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.Drawing
或System.Reflection
但允许用户保留在System.Windows
命名空间内,即WPF。 它确实需要引用System.Windows.Media
,如果你在WPF中使用Colors,你可能已经拥有它。 如果你像我一样,你试着不要在没有很好需要的情况下将System.Drawing
添加到你的WPF应用程序中。 至于为何留在WPF名称空间内,这是一个偏好问题。 例如,请参阅WPF v / s System.Drawing上的讨论。