c# - C# 中可读文本颜色的十六进制值颜色

标签 c# .net winforms

<分区>

我正在制作一个系统,其中包括使用“colorDialog”选择颜色并将其显示在文本框上。问题是其他颜色显示十六进制值(如 ffff8000)。我怎样才能把它变成可读的文本?

我有一个解决方案:

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

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

最佳答案

只获取完美匹配的颜色名称:

您可以使用 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 空间中运行,这可能会产生不同于人类可能对颜色进行分类的结果。

关于c# - C# 中可读文本颜色的十六进制值颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51237954/

相关文章:

c# - 打开 WinForm 时隐藏控制台

c# - Log4Net 创建空日志文件,而不是实际记录

c# - 在同一个变量上重复创建新对象

c# - 如何从textBox删除提示音?

c# - T-SQL 可以存储 ulong 的吗?

.net - 是否可以反汇编 monomac 文件?

c# - 通过 C#.net 获取 Excel 中命名区域的范围

.net - 我应该如何设计一个类库以允许 IoC,但不依赖于特定容器

c# - 如何检查两个控件是否在 Windows 窗体中重叠

c# - WinForms 中的用户输入验证