7

16 進数値を使用して定義済みの色の名前を取得する方法は知っていますが、16 進数値を最も近い既知の色に近似しながら色の名前を取得する方法は知っています。

4

2 に答える 2

6

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;
}
于 2012-07-31T20:19:35.613 に答える
2

https://stackoverflow.com/a/7792104/224370では、名前付きの色を正確な RGB 値に一致させる方法について説明しています。近似させるには、色がどれだけ離れているかを計算する距離関数が必要です。これを RGB 空間 (R、G、および B 値の差の二乗和) で実行しても、完全な答えは得られません (ただし、十分な結果になる可能性があります)。そのようにする例については、https://stackoverflow.com/a/7792111/224370を参照してください。より正確な答えを得るには、HSL に変換してから比較する必要がある場合があります。

于 2012-07-31T20:03:29.560 に答える