通过十六进制值获取颜色名称?

7
我知道如何使用十六进制值获取预定义颜色的名称,但如何获取最接近已知颜色的十六进制值对应的颜色名称。
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;
}

2
https://dev59.com/Nmsz5IYBdhLWcg3wlY-9#7792104详细介绍了如何将一个命名颜色匹配到一个精确的RGB值。要让它近似,你需要一些距离函数来计算颜色之间的差距。在RGB空间中进行此操作(R、G和B值的差异平方和)不会给出完美的答案(但可能足够好)。请参见https://dev59.com/Nmsz5IYBdhLWcg3wlY-9#7792111中的示例。如果您需要更精确的答案,则可能需要转换为HSL然后进行比较。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接