簡體   English   中英

將ARGB顏色值反轉為ABGR的快速算法?

[英]Fast algorithm to invert an ARGB color value to ABGR?

我正在使用IntBuffer來操作Bitmap的像素,但緩沖區中的值應該是AABBGGRR ,而顏色常量是AARRGGBB 我知道我可以使用Color.argbColor.a ,...來反轉,但我認為它並不完美。

我需要操作非常多的像素,所以我需要一種能夠在短時間內執行此算子的算法。 我想到了這個Bit Expression,但它不正確:

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
}

由於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;
}

在我看來,以下功能足夠快,可以在傳遞ARGB顏色時返回ABGR顏色, 反之亦然!

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM