我正在创建一种颜色工具,这个工具应该告诉我颜色是否接近另一种颜色,例如:
Color[] colors = new colors[] { Color.FromArgb(0,0,255), Color.FromArgb(0,109,251)};
//colors[0] IS BLUE
//colors[1] IS BRIGHTER BLUE (#006DFB)
bool TheyClose = ColorsAreClose(colors[0],colors[1]); //TRUE BLUE IS CLOSE
//TheyColse Should Be = TURE
ColorsAreClose()
函数应该是什么样子?
这样怎么样?
bool ColorsAreClose(Color a, Color z, int threshold = 50)
{
int r = (int)a.R - z.R,
g = (int)a.G - z.G,
b = (int)a.B - z.B;
return (r*r + g*g + b*b) <= threshold*threshold;
}
(我只是猜测默认阈值,但您应该将其设置为您想要的值。)
基本上,这只是计算,平均而言,三个颜色通道是否足够接近两种颜色
一个简单的方法,测量RGB距离:
public bool ColorsAreClose(Color[] colors)
{
var rDist = Math.Abs(colors[0].R - colors[1].R);
var gDist = Math.Abs(colors[0].G - colors[1].G);
var bDist = Math.Abs(colors[0].B - colors[1].B);
if(rDist + gDist + bDist > Threshold)
return false;
return true;
}
阈值是一个常量,具有您想要考虑接近的最大偏差。
可以计算三维色彩空间距离
Math.Sqrt(Math.Pow(c1.R-c2.R,2)+Math.Pow(c1.G-c2.g,2)+Math.Pow(c1.B-c2.b,2)));
或者你可以计算色相差异
Math.Abs(c1.GetHue() - c2.GetHue());
这有点主观,不科学,我曾经在一个项目中使用过以下过程。
public bool IsMatch(Color colorA, Color colorB)
{
return IsMatch(colorA.Red, colorB.Red)
&& IsMatch(colorA.Green, colorB.Green)
&& IsMatch(colorA.Blue, colorB.Blue);
}
public bool IsMatch(double colorA, double colorB)
{
var difference = colorA - colorB;
return -5 < difference
|| difference < 5;
}
如果只讨论色相,你可以单独比较RGB值的差异,如果总差异低于你设定的固定数量,那么你可以称它们接近。
可以这样开头:
double delta = Math.Abs(c1.GetHue() - c2.GetHue());
if(delta > 180)
delta = 360 - delta;
return delta <= threshold
有关hue的更多信息请参见:http://en.wikipedia.org/wiki/Hue