如何在C#中获取RGB值时获取颜色名称?

fre*_*sky 15 c#

我正在创建一个应用程序来查找图像最常用的颜色,我最多得到颜色的RGB值,但如何获取颜色名称,帮助PLZ.

Jon*_*eet 22

如注释中所述,KnownColor枚举可用于使这更简单:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Reflection;

class Test
{
    static void Main()
    {
        Color color = Color.FromArgb(255, 0, 0);
        Console.WriteLine(color.Name); // ffff0000

        var colorLookup = Enum.GetValues(typeof(KnownColor))
               .Cast<KnownColor>()
               .Select(Color.FromKnownColor)
               .ToLookup(c => c.ToArgb());

        // There are some colours with multiple entries...
        foreach (var namedColor in colorLookup[color.ToArgb()])
        {
            Console.WriteLine(namedColor.Name);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

原始答案

Color.FromArgb会给你一个Color,但它永远不会有名字.据我所知,你需要使用反射来获取命名颜色.

这是Cole Campbell解决方案的另一个版本,我同时正在努力...

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Reflection;

class Test
{
    static void Main()
    {
        Color color = Color.FromArgb(255, 0, 0);
        Console.WriteLine(color.Name); // ffff0000

        var colorLookup = typeof(Color)
               .GetProperties(BindingFlags.Public | BindingFlags.Static)
               .Select(f => (Color) f.GetValue(null, null))
               .Where(c => c.IsNamedColor)
               .ToLookup(c => c.ToArgb());

        // There are some colours with multiple entries...
        foreach (var namedColor in colorLookup[color.ToArgb()])
        {
            Console.WriteLine(namedColor.Name);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Col*_*ell 12

此方法使用反射检查Color类上的预定义颜色,并将它们与作为参数传入的颜色进行比较.这可以进一步优化,但它应该让您了解一般技术.

private static String GetColorName(Color color)
{
    var predefined = typeof(Color).GetProperties(BindingFlags.Public | BindingFlags.Static);
    var match = (from p in predefined where ((Color)p.GetValue(null, null)).ToArgb() == color.ToArgb() select (Color)p.GetValue(null, null));
    if (match.Any())
       return match.First().Name;
    return String.Empty;
}
Run Code Online (Sandbox Code Playgroud)

  • 颜色是一种结构.FirstOrDefault将返回一个空颜色,而不是null. (2认同)

mre*_*ros 2

您应该能够使用 System.Drawing 命名空间中的 Color 类,它有一个返回 Color 对象的静态方法 FromARGB。它有几个重载,其中一个允许您输入 RGB 值,如下所示:

var color = Color.FromArgb(100, 5,5,5).Name;
Run Code Online (Sandbox Code Playgroud)

  • **不会**以“Red”形式返回名称。对于您的示例,名称为 64050505。 (3认同)