2012-11-02 46 views
2

我想交換像素的紅色和藍色值。應該這樣做的方法接收像素爲int 0xAARRGGBB,其中AA是alpha的十六進制值,r,g,b是顏色的例如。 0xFF0000FF爲完全不透明的藍色。在Java中交換十六進制int元素

我會將該值轉換爲一個字符串,然後使用substring()將其剪除,並按修改後的順序將其拼接在一起,然後將結果轉換回int。這看起來不夠好,不起作用:

public int filterRGB(int x, int y, int pixel) { 

    int filteredPixel; 
    String s, a, r, g, b, res; 
     s = Integer.toString(pixel);    
     a = s.substring(2,4);//alpha     
     r = s.substring(4,6);//r 
     g = s.substring(6,8);//g 
     b = s.substring(8,10);//b 

    res = "0x" + a + b + g + r; 
    filteredPixel = Integer.parseInt(res); 

    return filteredPixel; 

它不工作的原因似乎是子串(8,10)。該行之後的代碼未執行。它確實與子字符串(8,9)一起工作,但是會切斷藍色的第二個十六進制值。我不知道如何獨自看這個,所以有人可以解釋一下嗎?

+2

'String.toHexString()' – Mordechai

回答

3

如果用

s = Integer.toString(pixel, 16); 
a = s.substring(0,2);//alpha 
r = s.substring(2,4);//r 
g = s.substring(4,6);//g 
b = s.substring(6,8);//b 

更換

s = Integer.toString(pixel); 

你的方法應該工作。

然而,更好的辦法是使用位算術和轉移到執行重排:

int a = (pixel >>> 24) & 0xFF; 
int r = (pixel >>> 16) & 0xFF; 
int g = (pixel >>> 8) & 0xFF; 
int b = (pixel >>> 0) & 0xFF; 

int filteredPixel = (a << 24) | (b << 16) | (g << 8) || (r << 0);