2011-04-03 54 views
4

我有顏色的十六進制格式的列表:C#圓形顏色到列表中的顏色

String[] validcolors = new String[] 
{ 
    "0055A5", 
    "101010", 
    "E4D200", 
    "FFFFFF", 
    "006563", 
    "A97B3E", 
    "B80000", 
    "6E3391", 
    "D191C3", 
    "D68200", 
    "60823C", 
    "AA8D73", 
    "73A1B8", 
    "6E6D6E", 
    "00582C", 
    "604421" 
};  

和顏色對象:

Color c = ... 

我想找到的顏色最接近c in validcolors。有人可以幫我嗎?我最初的想法是'RGB值最接近',但任何作品都很好。

+2

'最接近'按什麼指標? – AakashM 2011-04-03 12:22:02

+0

最接近的RGB值是我試圖實現的。 – Entity 2011-04-03 12:24:22

+0

我誤解了這個問題。我將刪除我的答案,但保留此字符串進行顏色轉換:'Color.FromArgb(int.Parse(s.Substring(0,2),NumberStyles.HexNumber),int.Parse(...' – HuBeZa 2011-04-03 12:31:49

回答

6

我想轉化十六進制到.NET的顏色,然後計算somr排序的距離((X2-X1)²+(Y2-Y1)2),並以最近使用這個距離:

string closestColor = ""; 
double diff = 200000; // > 255²x3 

foreach(string colorHex in validColors) 
{ 
    Color color = System.Drawing.ColorTranslator.FromHtml("#"+colorHex); 
    if(diff > (diff = (c.R - color.R)²+(c.G - color.G)²+(c.B - color.B)²)) 
     closestColor = colorHex; 
} 

return closestColor; 
+0

謝謝!如果我使用這種方法(它完美地工作)會產生奇怪的結果,比如科迪說,像他建議的那樣,修改使用HSV的方法解決了這個問題。 – Entity 2011-04-03 22:52:34

+0

怎麼樣你修改它使用HSV? – 2013-11-07 15:17:09

2

兩種顏色之間的距離取決於您使用的顏色模型。所以直到我們知道你喜歡什麼樣的模型,我們都無法提供幫助。

+0

RGB會很好 – Entity 2011-04-03 12:41:27

+0

然後用manji的答案。 – 2011-04-03 12:48:26

0

繼承人使用HSB的(詳細)方法。

float targetHue = c.GetHue(); 
float targetSat = c.GetSaturation(); 
float targetBri = c.GetBrightness(); 

string closestColor = ""; 
double smallestDiff = double.MaxValue; 

foreach (string colorHex in validcolors) 
{ 
    Color currentColor = ColorTranslator.FromHtml("#" + colorHex); 
    float currentHue = currentColor.GetHue(); 
    float currentSat = currentColor.GetSaturation(); 
    float currentBri = currentColor.GetBrightness(); 

    double currentDiff = Math.Pow(targetHue - currentHue, 2) + Math.Pow(targetSat - currentSat, 2) + Math.Pow(targetBri - currentBri, 2); 

    if (currentDiff < smallestDiff) 
    { 
     smallestDiff = currentDiff; 
     closestColor = colorHex; 
    } 
} 

return closestColor;