【问题标题】:Script for replacing color codes to color names?将颜色代码替换为颜色名称的脚本?
【发布时间】:2011-12-07 23:01:31
【问题描述】:

有人知道将颜色代码更改为颜色名称的方法吗?我有一个带有颜色代码的 XML: 我需要:#FFFFFF 替换为 White#000000 替换为 Black 等。

如果您知道脚本、批处理、C# 程序或任何其他方面的知识,我们将不胜感激

谢谢:)

【问题讨论】:

标签: c# html colors batch-file


【解决方案1】:

如果没有找到名称或 RGB 值,这是一个检索名称或 RGB 值的方法:

static Color[] colors = typeof(Color)
    .GetProperties(BindingFlags.Public | BindingFlags.Static)
    .Where(pi => pi.CanRead && pi.PropertyType == typeof(Color))
    .Select(pi => (Color)pi.GetValue(null, null))
    .ToArray();

static IEnumerable<string> FindColorNames(string htmlColor)
{
    // like "#RRGGBB" or "#AARRGGBB" or "Red" or "red"
    var color = ColorTranslator.FromHtml(htmlColor);
    return colors.Where(cc => cc.R == color.R
                           && cc.G == color.G
                           && cc.B == color.B
                           && cc.A == color.A)
                 .Select(cc => cc.Name);
}

static string FindColorName(string htmlColor)
{
    return FindColorNames(htmlColor).FirstOrDefault() ?? htmlColor;
}

// #FFFFFF: White
// #000000: Black
// #333333: 333333
// #FF00FF: Fuchsia (Magenta also matches)

使用更好的搜索模式的更新:

static Dictionary<int, string[]> colors = static Color[] colors = typeof(Color)
    .GetProperties(BindingFlags.Public | BindingFlags.Static)
    .Where(pi => pi.CanRead && pi.PropertyType == typeof(Color))
    .Select(pi => (Color)pi.GetValue(null, null))
    .GroupBy(cc => cc.ToArgb())
    .ToDictionary(gg => gg.Key, gg.Select(cc => cc.Name).ToArray());

static IEnumerable<string> FindColorNames(string htmlColor)
{
    var color = ColorTranslator.FromHtml(htmlColor);
    string[] names;
    if (!colors.TryGetValue(color.ToArgb(), out names))
    {
        return Enumerable.Empty<string>();
    }

    return names;
}

static string FindColorName(string htmlColor)
{
    return FindColorNames.FirstOrDefault() ?? htmlColor;
}

【讨论】:

  • @JeremyThompson:切换到ColorTranslator 以根据您的回答进行转换。谢谢!
【解决方案2】:

这有点糟糕,可能会给出一些意想不到的值,但在技术上是正确的。随意使用您自己的颜色名称列表进行更新:

    public string GetColorName(int r, int g, int b)
    {
        return GetColorName(Color.FromArgb(r, g, b));
    }

    public string GetColorName(Color color)
    {
        foreach (var knownColorName in Enum.GetNames(typeof(KnownColor)))
        {
            var knownColor = Color.FromName(knownColorName);
            if (knownColor.R == color.R && knownColor.G == color.G && knownColor.B == color.B)
            {
                return knownColorName;
            }
        }
        return color.Name;
    }

【讨论】:

    【解决方案3】:
    System.Drawing.ColorTranslator.FromHtml("#FFFFFF")
    
    
    Color.FromArgb(255, 255, 255, 255).ToArgb() == Color.White.ToArgb()
    

    【讨论】:

      猜你喜欢
      • 2015-04-12
      • 2018-11-14
      • 2021-11-26
      • 2017-04-14
      • 2012-07-07
      • 2011-12-09
      • 2018-11-02
      • 2014-12-12
      相关资源
      最近更新 更多