2017-10-17 351 views
0

正如問題所述,我想比較兩種顏色使用它們的rgb值,但我想忽略alpha。 我沒有得到那些位移和位智的操作符,所以你能告訴我有沒有比下面的代碼更優雅的方式來做到這一點?如何比較rgb值,忽略alpha

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

好像你可能想看看在使用'getColorComponents'方法(https://開頭的文檔。 oracle.com/javase/7/docs/api/java/awt/Color.html#getColorComponents(float [])),但傳入一個空數組或另一個數組。它可能通過數組比較反而變得更簡潔,但可能慢得可以忽略不計。 – Raizuri

+0

所以我可以像'c1.getColorComponents(null).equals(c2.getColorComponents(null))'那樣做? – Duke

+0

有'getRGB',所以你可以一次比較R G和B – harold

回答

1

如果你想逐位解決方案,它看起來是這樣的:

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() 

是異或(XOR或)。其結果將匹配的位爲0,而對於不同的位則爲1。如果整個匹配結果的整數只是每個位都爲零。由於我們不關心alpha位,步驟

(...) & 0x00_ff_ff_ff 

是「和」,因此結果具有在一個有點1只有在有兩側1。由於0x00_ff_ff_ff對於alpha通道位沒有1,對於所有的RGB位都沒有1,所以這隻會保留RGB部分開啓的位。

最後,對於比賽,我們現在希望所有的位都關閉,所以我們可以比較爲0