将ARGB颜色值反转为ABGR的快速算法?

时间:2012-09-06 16:55:01

标签: java android algorithm colors

我正在使用IntBuffer来操纵位图的像素,但缓冲区中的值应为 AABBGGRR ,而颜色常量为 AARRGGBB 。我知道我可以使用Color.argbColor.a,...来反转,但我认为它并不完美。

我需要操作非常多的像素,所以我需要一种可以在短时间内执行此算子的算法。我想到了这个比特表达,但它不正确:

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
}

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

在我看来,以下功能足够快返回 ABGR 颜色,同时传递 ARGB 颜色和副 - 反之亦然!

Alt+Enter -> Format Selection