2

我正在寻找按“颜色距离”对列表进行排序。我正在使用以下函数来计算两种颜色之间的距离:

double colorDistance(Color c1, Color c2) {
    double rmean = (c1.getRed() + c2.getRed()) / 2;
    int r = c1.getRed() - c2.getRed();
    int g = c1.getGreen() - c2.getGreen();
    int b = c1.getBlue() - c2.getBlue();
    double weightR = 2 + rmean / 256;
    double weightG = 4.0;
    double weightB = 2 + (255 - rmean) / 256;
    return Math.sqrt(weightR * r * r + weightG * g * g + weightB * b * b);
}

因此,如您所见,我使用 RGB 值来计算两种颜色之间的“距离”。这个函数非常适合我需要计算的东西,因为我不需要精确的精度。问题是,我不仅需要知道距离,还需要知道 c1 是在 c2 之前还是之后,以便我可以根据颜色距离创建一个排序列表。

如果还不够清楚,一个例子可能会有所帮助。纯黑色和纯白色之间的颜色距离将在 256 附近。在当前状态下,此函数将为 colorDistance(black, white) 和 colorDistance(white, black) 返回相同的 ~256。我怎样才能使 colorDistance(black, white) 返回 256 而 colorDistance(white, black) 返回 -256?

如果可以的话,我不反对使用 HSV/HSL,但我对 RGB 更加熟悉。如果可以提供一个函数来计算 HSV/HSL 的正或负颜色距离,那就把它带上吧!

或者更好的是,另一个简单的函数将采用两种颜色并简单地决定 c1 是在 c2 之前还是之后!

4

2 回答 2

2

如果出现以下情况,您可以将答案乘以负 1:

int pixel = (red & 0xFF) << 24 |
              (blue & 0xFF) << 16 |
              (green & 0xFF) <<  8 |
              (255 & 0xFF); // 255 is alpha value

小于其他颜色的像素。

编辑:我留下了 alpha 值,以防您将来想使用它。如果没有,那么你可以把这部分去掉,每班减少 8 班。像这样:

int pixel = (red & 0xFF) << 16 |
            (blue & 0xFF) << 8 |
            (green & 0xFF);
于 2012-07-12T17:15:02.850 回答
0

您可以尝试通过将 RGB 颜色表示为十六进制数字来创建一个数组,然后按值对列表进行排序。

于 2012-07-12T17:17:32.973 回答