2014-04-01 160 views
0

我已經在顏色以下方式獲取從顏色類

{ Name=ffff8c00, ARGB=(255, 255, 140, 0) } 

我可以chekc顏色名稱來顏色名稱?無論是紅色還是綠色..我想要的顏色的名稱..

是否有可能找到?

+0

哪個顏色類? – SLaks

+3

System.Drawing。顏色 – Pankaj

+1

如果名稱已知,則可以從「Name」屬性中檢索。否則,您無法以任何簡單的方式獲取名稱。 –

回答

2

您可以從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

3

雖然這是事實,你可以使用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(); 
+0

使用[KeyedCollection](http://msdn.microsoft.com/en-us/library/ms132438%28v=vs.110%29.aspx)代替字典可能會更好,並且也通過枚舉顏色名稱枚舉來填充靜態列表。 –

+0

@ScottChamberlain謝謝!使用枚舉的好點。我編輯以反映您的建議。現在我將單獨離開'KeyedCollection',因爲我之前沒有聽說過它,但期待了解.NET框架的新部分。 – Sam

+0

鍵控集合是超級簡單的,事實上我可以把它的整個代碼放在這個評論''ColorDictionary:KeyedCollection {protected override int GetKeyForItem(Color color){return color.ToArgb(); }}'現在它的行爲像一個'Dictionary ',但你只需要像'.Add(Color.White)'那樣調用它,並且它會根據你在'TKey GetKeyForItem'中實現的函數自動填充'0xFFFFFFFF' TValue)'。我建議的唯一的其他調整是爲您的字典編寫一個自定義比較器,與「顏色」對象進行比較,但忽略Alpha通道。 –