2

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

在此处输入图像描述

我想我必须比较它的 RGB 值并查看它在这些原色范围内的位置,然后将其设置为红色、黄色或蓝色等。

这样做的最佳方法是什么?谢谢

编辑 这个问题被标记为重复,但我检查了上述重复问题的另一个答案,但它没有提供我想要的答案。

使用公式

d = sqrt((r2-r1)^2 + (g2-g1)^2 + (b2-b1)^2)

有时会为不同的颜色产生相同的值。例如,输入颜色为R170 : G0 : B255. 使用公式,与白色R255 : G255 : B255和红色的距离产生 (int)269。R255 : G0 : B0那么哪个颜色更接近,红色还是白色?我从列表中删除了黑白,但其他一些颜色仍然存在问题。

我正在与几种颜色进行比较,即:黑色、白色、红色、石灰。蓝色,黄色,青色。此处的 RGB 颜色表中列出的洋红色和灰色 rapidtables.com/web/color/RGB_Color.htm

4

2 回答 2

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();
于 2013-06-24T07:21:22.750 回答
0

如果您想在两种颜色之间进行真正的比较,则不应使用 RGB 颜色空间。它不适合颜色计算。

最好的办法是将其转换为 LAB 颜色空间。实验室空间

为此,您需要将 RGB 转换为 XYZ 值,然后将其转换为 LAB。您可以在此网站上找到计算方法:Bruce Lindbloom

当您拥有 LAB 颜色时,您可以选择差异公式。最简单的是 CIE74,但如果您想要最准确的结果,您需要使用 CIEDE2000。差分公式

在过去的 5 个月里,我在我从事的一个项目中使用了这些公式,所以如果您需要任何帮助,请告诉我。

于 2013-06-26T12:56:14.383 回答