Java 如何比较rgb值,忽略alpha

Java 如何比较rgb值,忽略alpha,java,colors,bit-manipulation,rgb,Java,Colors,Bit Manipulation,Rgb,正如问题所说,我想用它们的rgb值来比较两种颜色,但我想忽略alpha。 我不懂那些移位和逐位运算符,所以你能告诉我有没有比下面的代码更优雅的方法来实现这一点 boolean compareRGB(Color c1, Color c2) { return c1.getRed() == c2.getRed() && c1.getGreen() == c2.getGreen() && c1.getBlue() == c2.getBlue(); } 如果您想要

正如问题所说,我想用它们的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位,所以步骤

(...) & 0x00_ff_ff_ff
是一个“and”,所以只有当两边都是1时,结果才有一个1英寸的比特。由于0x00_ff_ff_ff对于alpha通道位没有1,对于所有RGB位没有1,因此这将只保留RGB部分启用的位


最后,对于一个匹配,我们现在希望所有的位都是关闭的,因此我们可以将其与0进行比较。

看起来您可能希望使用
getColorComponents
方法()但传入一个空数组或另一个数组。可能通过数组比较,它会稍微干净一些,但速度可能会慢一些。所以我可以像
c1.getColorComponents(null).equals(c2.getColorComponents(null))
?有
getRGB
,所以你可以同时比较RG和B