我正在尝试创建一个接受随机颜色值的方法,然后检查它最接近的原色。
我想我必须比较它的RGB值,看看它在哪些原色范围内,然后将其设置为红色,黄色或蓝色等。
这样做的最佳方式是什么?感谢
修改 这个问题被标记为重复,但我检查了所述重复问题的其他答案,但它没有提供我所追求的答案。
使用公式
d = sqrt((r2-r1)^2 + (g2-g1)^2 + (b2-b1)^2)
有时会为不同颜色生成相同的值。例如,输入颜色为R170 : G0 : B255
。使用公式,白色R255 : G255 : B255
和红色R255 : G0 : B0
的距离产生(int)269。那么哪种颜色更接近,红色还是白色?我从列表中删除了黑色和白色,但其他颜色的问题仍然存在。
我与几种颜色比较,即:黑色,白色,红色,石灰。蓝色,黄色,青色。 RGB颜色表中列出的品红色和灰色quicktables.com/web/color/RGB_Color.htm
答案 0 :(得分:2)
我没有面向我的IDE,但这里是我对伪的评论(如有必要可以稍后更新)
var closestColor
Get vector magnitude of( myR + 255, myG, myB)
set closestColor to Red
Get vector magnitude of( myR , myG+ 255, myB)
If(Green is closer than red)
set closestColor to Green
Get vector magnitude of( myR , myG, myB + 255)
If(Blue is closer than closestColor)
set closestColor to Blue
Return closest color
<强>更新强>
我做了一个带扩展名的快速linq示例
public static double VectorMagnitude(this Color c, Color otherC)
{
return Math.Sqrt(((int)(c.R + otherC.R))^2 +
((int)(c.G + otherC.G))^2 +
((int)(c.B + otherC.B))^2);
}
private static List<Color> Colors()
{
return new List<Color>()
{
Color.Red,
Color.Blue,
Color.FromArgb(0,255,0)
};
}
var l = Colors().OrderBy(x => x.VectorMagnitude(
Color.FromArgb(255, R, G, B))).FirstOrDefault();
答案 1 :(得分:0)
如果您想要两种颜色之间的真实比较,则不应使用RGB颜色空间。 它不适合颜色计算。
最好的办法是将其转换为LAB色彩空间。 LAB space
要实现此目的,您需要将RGB转换为XYZ值,然后将它们转换为LAB。您可以在此网站上找到相关计算:Bruce Lindbloom
当您拥有LAB颜色时,您可以选择差异公式。最简单的是CIE74,但如果您想获得最准确的结果,则需要使用CIEDE2000。 Difference Formulas
我在过去的5个月中使用过这些公式来处理我参与的项目,所以如果您需要任何帮助,请告诉我。