我已經在顏色以下方式獲取從顏色類
{ Name=ffff8c00, ARGB=(255, 255, 140, 0) }
我可以chekc顏色名稱來顏色名稱?無論是紅色還是綠色..我想要的顏色的名稱..
是否有可能找到?
我已經在顏色以下方式獲取從顏色類
{ Name=ffff8c00, ARGB=(255, 255, 140, 0) }
我可以chekc顏色名稱來顏色名稱?無論是紅色還是綠色..我想要的顏色的名稱..
是否有可能找到?
您可以從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」標籤返回的名稱。
雖然這是事實,你可以使用Name
屬性來獲取顏色的名稱,這如果在構建Color
對象是提供或者如果Color
對象是使用KnownColor
名稱檢索的名稱是唯一的真實。如果使用自定義ARGB值構建,則即使提供了與已知顏色相匹配的值,也可以使用這些方法。您可以使用您信任的顏色名稱來源(來自here的值)的信息創建靜態Dictionary
,並提供可能性列表。
利用收集的個人色彩分量之間的差的絕對值兩種顏色之間的距離的一個簡單的定義,我們可以擴展的想法所涉及的彩色「最接近」所提供的顏色檢索名稱。請注意,我使用本SO answer中建議的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);
}
}
編輯:使用從斯科特的建議,你可以使用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);
的方法轉化爲Extension Methods。這使得名稱變得如此簡單:
Color myColor = Color.FromArgb(255,0,0,0);//black
String myColorName = myColor.GetName();
String myNearestName = myColor.GetNearestName();
使用[KeyedCollection](http://msdn.microsoft.com/en-us/library/ms132438%28v=vs.110%29.aspx)代替字典可能會更好,並且也通過枚舉顏色名稱枚舉來填充靜態列表。 –
@ScottChamberlain謝謝!使用枚舉的好點。我編輯以反映您的建議。現在我將單獨離開'KeyedCollection',因爲我之前沒有聽說過它,但期待了解.NET框架的新部分。 – Sam
鍵控集合是超級簡單的,事實上我可以把它的整個代碼放在這個評論''ColorDictionary:KeyedCollection
哪個顏色類? – SLaks
System.Drawing。顏色 – Pankaj
如果名稱已知,則可以從「Name」屬性中檢索。否則,您無法以任何簡單的方式獲取名稱。 –