从颜色类中获取颜色名称
本文关键字:颜色 获取 | 更新日期: 2023-09-27 17:55:29
我有以下颜色
{ Name=ffff8c00, ARGB=(255, 255, 140, 0) }
我可以检查颜色名称吗?无论是红色还是绿色..我想要颜色的名字..
有可能找到吗?
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
虽然您可以使用 Name
属性来获取颜色的名称,但仅当在构造 Color
对象时提供了名称或使用KnownColor
名称检索Color
对象时,才如此。如果使用自定义 ARGB 值构造,则即使提供了与已知颜色匹配的值,这些方法也将不起作用。您可以使用来自您信任的颜色名称的来源(我从这里获得我的值)的信息创建静态Dictionary
,并提供可能性列表。
通过提出两种颜色之间距离的简单定义作为各个颜色分量之间差异的绝对值,我们可以扩展想法以检索"最接近"所提供颜色的颜色的名称。请注意,我按照此 SO 答案中的建议使用 MoreLINQ 项目提供的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
只是一个包含KnownColor.ActiveCaptionText
、KnownColor.ButtonFace
等元素的HashSet<KnownColor>
。
您还可以将 static
关键字添加到ColorMapper
类声明中
public static class ColorMapper
{
...
}
并将方法签名更改为:
public static String GetName(this Color color);
public static String GetNearestName(this Color color);
将方法转换为扩展方法。这使得获取名称变得像以下一样简单:
Color myColor = Color.FromArgb(255,0,0,0);//black
String myColorName = myColor.GetName();
String myNearestName = myColor.GetNearestName();