首页 > 解决方案 > 十六进制值颜色到 C# 中的可读文本颜色

问题描述

我正在制作一个系统,其中包括使用“colorDialog”选择颜色并将其显示在文本框上。问题是其他颜色显示十六进制值(如 ffff8000)。如何将其更改为可读文本?

我有一个解决方案:

private string changeColortoReadable(string changedColor){
     if(colorDialog.Color.Name == "ffff8000"){
         changedColor = "Orange";
     }
     return changedColor;
}

将所有十六进制颜色转换为可读颜色对我来说有点累和耗时。

标签: c#.netwinforms

解决方案


仅通过完美匹配获取颜色名称:

您可以使用 KnownColor 枚举来创建您需要的查找。见下文:

public static class HexColorTranslator
{
    private static Dictionary<string, string> _hex2Name;

    private static Dictionary<string, string> Hex2Name
    {
        get
        {
            if (_hex2Name == null)
            {
                _hex2Name = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
                foreach (KnownColor ce in typeof(KnownColor).GetEnumValues())
                {
                    var name = ce.ToString();
                    var color = Color.FromKnownColor(ce);
                    var hex = HexConverter(color);
                    _hex2Name[hex] = name;
                }
            }

            return _hex2Name;
        }
    }

    //https://stackoverflow.com/a/2395708/1155329
    private static String HexConverter(System.Drawing.Color c)
    {
        return c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");
    }

    public static string GetKnownColorFromHex(string hex)
    {
        hex = hex.TrimStart('#');
        if (Hex2Name.TryGetValue(hex, out string result)) return result;
        return "???";
    }
}

通过调用 GetKnownColorFromHex 函数获取颜色:

 Console.WriteLine(HexColorTranslator.GetKnownColorFromHex("#ff0000")); // Red

请注意,遗憾的是您不能使用 ToKnownColor,除非颜色是使用已知颜色创建的。看:

var aquaKnown = Color.FromKnownColor(KnownColor.Aqua);
var aquaUnknown = Color.FromArgb(aquaKnown.A, aquaKnown.R, aquaKnown.G, aquaKnown.B);
Console.WriteLine(aquaKnown.ToKnownColor()); //Aqua
Console.WriteLine(aquaUnknown.ToKnownColor()); //0

获取 RGB 空间中最接近颜色的名称:

如果你想得到最接近的颜色,你可以试试这个:

 public static string GetNearestKnownColor(string hex)
 {
     var color = System.Drawing.ColorTranslator.FromHtml(hex);

     double bestSquared = double.MaxValue;
     KnownColor bestMatch = default(KnownColor);
     foreach (KnownColor ce in typeof(KnownColor).GetEnumValues())
     {
         Color tryColor = Color.FromKnownColor(ce);
         double deltaR = tryColor.R - color.R;
         double deltaG = tryColor.G - color.G;
         double deltaB = tryColor.B - color.B;
         double squared = deltaR * deltaR + deltaG * deltaG + deltaB * deltaB;
         if(squared == 0) return ce.ToString();
         if (squared < bestSquared)
         {
             bestMatch = ce;
             bestSquared = squared;
         }
     }

     return bestMatch.ToString();
 }

请注意,这并不完全准确,因为它在 RGB 空间中运行,这可能会产生不同于人类对颜色进行分类的结果。


推荐阅读