2012-07-31 7 views

答えて

2

https://stackoverflow.com/a/7792104/224370は、名前付きカラーと正確なRGB値のマッチング方法を説明しています。近似するには、色の距離を計算する距離関数が必要です。これをRGB空間(R、G、B値の差の平方和の合計)で行うと、完璧な答えは得られませんが、十分に良いかもしれません。このようにしている例については、https://stackoverflow.com/a/7792111/224370を参照してください。より正確な回答を得るには、HSLに変換して比較する必要があります。

5

ここには、Ianの提案に基づくコードがあります。私は色の値の数でそれをテストし、うまくいくようです。

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

ありがとうございます。 – fresky

関連する問題