2012-07-31 18 views

Respuesta

2

https://stackoverflow.com/a/7792104/224370 explica cómo hacer coincidir un color con nombre con un valor RGB exacto. Para que sea aproximado, necesita algún tipo de función de distancia en la que calcule qué tan separados están los colores. Hacer esto en el espacio RGB (suma de cuadrados de diferencias en los valores R, G y B) no le dará una respuesta perfecta (pero puede ser lo suficientemente bueno). Vea https://stackoverflow.com/a/7792111/224370 para un ejemplo que lo haga de esa manera. Para obtener una respuesta más precisa, es posible que deba convertir a HSL y luego comparar.

5

Aquí hay un código basado en la sugerencia de Ian. Lo probé en una serie de valores de color, parece funcionar bien.

GetApproximateColorName(ColorTranslator.FromHtml(source)) 

private static readonly IEnumerable<PropertyInfo> _colorProperties = 
      typeof(Color) 
      .GetProperties(BindingFlags.Public | BindingFlags.Static) 
      .Where(p => p.PropertyType == typeof (Color)); 

static string GetApproximateColorName(Color color) 
{ 
    int minDistance = int.MaxValue; 
    string minColor = Color.Black.Name; 

    foreach (var colorProperty in _colorProperties) 
    { 
     var colorPropertyValue = (Color)colorProperty.GetValue(null, null); 
     if (colorPropertyValue.R == color.R 
       && colorPropertyValue.G == color.G 
       && colorPropertyValue.B == color.B) 
     { 
      return colorPropertyValue.Name; 
     } 

     int distance = Math.Abs(colorPropertyValue.R - color.R) + 
         Math.Abs(colorPropertyValue.G - color.G) + 
         Math.Abs(colorPropertyValue.B - color.B); 

     if (distance < minDistance) 
     { 
      minDistance = distance; 
      minColor = colorPropertyValue.Name; 
     } 
    } 

    return minColor; 
} 
+0

Thankyou so muh Kartan ... :) – fresky

Cuestiones relacionadas