2012-09-06 31 views
6

我使用IntBuffer來操作位圖的像素,但緩衝區中的值應爲AABBGGRR,而顏色常量爲AARRGGBB。我知道我可以使用Color.argb,Color.a ......來倒置,但我認爲它並不完美。將ARGB顏色值反轉爲ABGR的快速算法?

我需要操縱大量的像素,所以我需要一個能夠在短時間內執行此操作的算法。我覺得這個比特表示的,但它是不正確:

0xFFFFFFFF^pSourceColor 

如果沒有更好的,也許我會用位移位運算符(執行Color.a,...),而不是調用功能以減少時間。

編輯:

這是我目前的功能轉換,但我認爲有建議立即進行刪除是一個更好的算法(少商)來執行它:

private int getBufferedColor(final int pSourceColor) { 
    return 
      ((pSourceColor >> 24) << 24) |   // Alpha 
      ((pSourceColor >> 16) & 0xFF) |   // Red -> Blue 
      ((pSourceColor >> 8) & 0xFF) << 8 |  // Green 
      ((pSourceColor) & 0xFF) << 16;   // Blue -> Red 
} 
+1

可能重複[如何將RGB轉換爲BGR?](http://stackoverflow.com/questions/3041499/how-to-convert-rgb-to-bgr) –

+0

沒有,只有該主題討論RGB。好的答案實際上是使用位移來獲得紅色,綠色和藍色。我的問題更加先進,因爲Alpha不會改變立場。 –

+0

1)沒有辦法解決這個問題(以高性能的方式)而不使用位移,2)最好的方法就是在這個答案中。在你的情況下,只需保存阿爾法,將其移出,然後在最後添加它。 –

回答

8

由於A和G爲通過屏蔽掉B和R然後再添加它們,你可能會做得更好一些。沒有測試它,但應該是95%右:

private static final int EXCEPT_R_MASK = 0xFF00FFFF; 
private static final int ONLY_R_MASK = ~EXCEPT_R_MASK; 
private static final int EXCEPT_B_MASK = 0xFFFFFF00; 
private static final int ONLY_B_MASK = ~EXCEPT_B_MASK; 

private int getBufferedColor(final int pSourceColor) { 
    int r = (pSourceColor & ONLY_R_MASK) >> 16; 
    int b = pSourceColor & ONLY_B_MASK; 
    return 
     (pSourceColor & EXCEPT_R_MASK & EXCEPT_B_MASK) | (b << 16) | r; 
} 
+0

謝謝。這是我正在尋找的! –

2

在我看來,下面的函數是足夠快速返回ABGR顏色,而傳遞一個ARGB顏色和副反之亦然!

int argbToABGR(int argbColor) { 
    int r = (argbColor >> 16) & 0xFF; 
    int b = argbColor & 0xFF; 
    return (argbColor & 0xFF00FF00) | (b << 16) | r; 
}