将颜色代码替换为颜色名称的脚本?

3

有没有人知道一种将颜色代码转换为颜色名称的方法?我有一个带有颜色代码的XML: 我需要用白色替换#FFFFFF,用黑色替换#000000等。

如果您知道脚本、批处理、C#程序或其他任何方式来实现这一点,将不胜感激。

谢谢 :)


为什么你想要这样做呢?你能提供一些背景信息吗? - dougajmcdonald
我认为你需要自己创建脚本,这个表格可能会有所帮助 - http://www.w3schools.com/html/html_colorvalues.asp - Nuno
4个回答

4
以下是一种方法,如果找不到名称,则将检索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进行转换。谢谢! - user7116

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;
    }

0

以下是一个命令行工具,可以完全满足你的需求:Cict

示例:

$ ./cict 000001
1   #000000 black

$ ./cict FFFFFF
0   #FFFFFF white

正如您所看到的,您只需将一个24位十六进制值传递给Cict,它就会报告找到的颜色距离、实际颜色值和名称。

(我是Cict的作者)


0
System.Drawing.ColorTranslator.FromHtml("#FFFFFF")


Color.FromArgb(255, 255, 255, 255).ToArgb() == Color.White.ToArgb()

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