2011-04-03 41 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;