将随机颜色分类为Windows Phone的一种主要颜色

时间:2013-06-24 06:50:01

标签: c# colors windows-phone-8

我正在尝试创建一个接受随机颜色值的方法,然后检查它最接近的原色。

enter image description here

我想我必须比较它的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

2 个答案:

答案 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个月中使用过这些公式来处理我参与的项目,所以如果您需要任何帮助,请告诉我。