从颜色类中获取颜色名称

时间:2014-04-01 02:51:31

标签: c#

我的颜色有以下方式

{ Name=ffff8c00, ARGB=(255, 255, 140, 0) }
我可以检查颜色名称吗?无论是红色还是绿色..我想要颜色的名称..

有可能找到吗?

2 个答案:

答案 0 :(得分:3)

虽然确实可以使用Name属性来获取颜色的名称,但只有在构造Color对象时提供了名称或Color时才会出现这种情况。使用KnownColor名称检索对象。如果使用自定义ARGB值构造,则即使提供了与已知颜色匹配的值也无法使用这些方法。您可以使用来自您信任的颜色名称的来源(我从here得到我的值)中的信息创建静态Dictionary,并提供可能性列表。

通过简单定义两种颜色之间的距离作为各个颜色成分之间差异的绝对值,我们可以扩展想法以检索颜色的名称"最接近"提供的颜色。请注意,我使用此MoreLINQ中建议的answer项目提供的MinBy扩展方法,以便更轻松地跟踪我的对象。

public class ColorMapper {

    //create the dictionary with the elements you are interested in
    private static Dictionary<int, String> colorMap = new Dictionary<int, String>()
    {
        {0xFFB6C1, "Light Pink"},
        {0x6B8E23, "Olive Drab"},
        //and the list goes on
    };

    public static String GetName(Color color)
    {
        //mask out the alpha channel
        int myRgb = (int)(color.ToArgb() & 0x00FFFFFF);
        if (colorMap.ContainsKey(myRgb))
        {
            return colorMap[myRgb];
        }
        return null;
    }
    public static String GetNearestName(Color color)
    {
        //check first for an exact match
        String name = GetName(color);
        if (color != null) 
        {
            return name;
        } 
        //mask out the alpha channel
        int myRgb = (int)(color.ToArgb() & 0x00FFFFFF);
        //retrieve the color from the dictionary with the closest measure
        int closestColor = colorMap.Keys.Select(colorKey => new ColorDistance(colorKey, myRgb)).MinBy(d => d.distance).colorKey;
        //return the name
        return colorMap[closestColor];
    }
}

//Just a simple utility class to store our
//color values and the distance from the color of interest
public class ColorDistance
{
    private int _colorKey;
    public int colorKey
    {
        get { return _colorKey; }
    }
    private int _distance;
    public int distance 
    {
        get {return _distance;}
    }

    public ColorDistance(int colorKeyRgb, int rgb2)
    {
        //store for use at end of query
        this._colorKey = colorKeyRgb;

        //we just pull the individual color components out
        byte r1 = (byte)((colorKeyRgb >> 16) & 0xff);
        byte g1 = (byte)((colorKeyRgb >> 8) & 0xff);
        byte b1 = (byte)((colorKeyRgb) & 0xff);

        byte r2 = (byte)((rgb2 >> 16) & 0xff);
        byte g2 = (byte)((rgb2 >> 8) & 0xff);
        byte b2 = (byte)((rgb2) & 0xff);

        //provide a simple distance measure between colors
        _distance = Math.Abs(r1 - r2) + Math.Abs(g1 - g2) + Math.Abs(b1 - b2);
    }
}

修改:使用Scott提供的建议,您可以使用KnownColor枚举初始化颜色值名称以列出所有值。您可以按如下方式将静态构造函数添加到ColorMapper类,并从Dictionary声明中删除我们的初始化元素。

static ColorMapper()
{
    foreach (KnownColor kc in Enum.GetValues(typeof(KnownColor)))
    {
        if (!ignoredColors.Contains(kc))
        {
            Color c = Color.FromKnownColor(kc);
            try
            {
                colorMap.Add(c.ToArgb() & 0x00FFFFFF, c.Name);
            }
            //duplicate colors cause an exception
            catch { }
        }
    }
}

您会注意到我检查了ignoredColors。这是因为KnownColors枚举包含您不太感兴趣的颜色值。具体来说,UI颜色的系统定义颜色可能不会让您感兴趣。 ignoredColors只是一个HashSet<KnownColor>,其中包含KnownColor.ActiveCaptionTextKnownColor.ButtonFace等元素。

您还可以将static关键字添加到ColorMapper类声明

public static class ColorMapper
{
    ...
}

并将方法签名更改为:

public static String GetName(this Color color);
public static String GetNearestName(this Color color);

将方法转换为Extension Methods。这使得名称变得如此简单:

Color myColor = Color.FromArgb(255,0,0,0);//black
String myColorName = myColor.GetName();
String myNearestName = myColor.GetNearestName();

答案 1 :(得分:3)

您可以从KnownColor获取名称。试试如下

        string name = "Unknown";
        foreach (KnownColor kc in Enum.GetValues(typeof(KnownColor)))
        {
            Color known = Color.FromKnownColor(kc);
            if (Color.FromArgb(255,255,140,0).ToArgb() == known.ToArgb())
            {
                label1.Text = known.Name;
                break;
            }
        }

这里我只是硬编码你的值并在名为'label1'的标签中返回名称。

检查此帖子http://social.msdn.microsoft.com/Forums/vstudio/en-US/3c80583e-d0a9-45e9-842a-bd7258f1fd2f/get-color-name-in-c?forum=csharpgeneral