¿Cómo obtener el nombre del color mientras tiene su valor RGB en C #?

Estoy creando una aplicación para encontrar el color más utilizado de una imagen, estoy dispuesto a obtener el valor RGB del color, pero cómo obtener el nombre del color, ayuda por favor.

Como se señala en los comentarios, la enumeración KnownColor se puede usar para simplificar esto:

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

Respuesta original

Color.FromArgb le dará un Color , pero nunca tendrá un nombre. Necesitas usar reflection para obtener los colores nombrados, que yo sepa.

Aquí hay otra versión de la solución de Cole Campbell que estaba trabajando al mismo tiempo …

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

Este método utiliza la reflexión para examinar los colores predefinidos en la clase Color y compararlos con el color pasado como argumento. Esto se puede optimizar aún más, pero debería darle una idea de la técnica general.

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

Debería poder usar la clase Color del espacio de nombres System.Drawing, tiene un método estático FromARGB que devuelve un objeto Color. Tiene varias sobrecargas, una que le permite ingresar los valores RGB de la siguiente manera:

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

Para algo rápido y simple, intente esto (en 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(); } 

En Visual Studio 2010, se p.GetValue(p, null) . En Visual Studio 2013+ puede usar p.GetValue(p) .

La ventaja de esta técnica, además de su brevedad, es que no requiere referencias a System.Drawing o System.Reflection pero permite al usuario permanecer dentro del espacio de nombres System.Windows , que es WPF. Requiere una referencia a System.Windows.Media que probablemente ya debería tener si está trabajando con Colors en WPF. Si es como yo, intenta no agregar System.Drawing a sus aplicaciones WPF sin una buena necesidad. En cuanto a por qué permanecer dentro del espacio de nombres de WPF, es una cuestión de preferencia. Ver, por ejemplo, discusiones en WPF v / s System.Drawing .