如何比较 rgb 值,忽略 alpha

How to compare rgb values, ignoring alpha

如问题所述,我想使用 rgb 值比较两种颜色,但我想忽略 alpha。 我不懂那些位移位和位运算符,所以你能告诉我有没有比下面的代码更优雅的方法来做到这一点?

boolean compareRGB(Color c1, Color c2) {
    return c1.getRed() == c2.getRed() && c1.getGreen() == c2.getGreen() && c1.getBlue() == c2.getBlue();
}

如果你想要一个按位的解决方案,它可能看起来像这样:

public static boolean equalsIgnoreAlpha(Color c1, Color c2) {
    return ((c1.getRGB() ^ c2.getRGB()) & 0x00_ff_ff_ff) == 0x00_00_00_00;
}

第一部分

    c1.getRGB() ^ c2.getRGB()

是异或(或异或)。对于匹配的位,其结果将为 0,对于不同的位,其结果将为 1。如果整个整数匹配,结果将只是每个位为零。由于我们不关心 alpha 位,因此 step

(...) & 0x00_ff_ff_ff

是一个 'and',所以只有当两边都是 1 时,结果才会有一点 1。由于 0x00_ff_ff_ff 的 alpha 通道位没有 1,所有 RGB 位都没有 1,因此这将只保留 RGB 部分的位。

最后,对于匹配,我们现在期望所有位都关闭,因此我们可以与 0 进行比较。