6

IntBuffer用来操作位图的像素,但缓冲区中的值应该是AABBGGRR,而颜色常量是AARRGGBB。我知道我可以使用Color.argb, Color.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
}
4

2 回答 2

11

由于 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;
}
于 2012-09-06T17:19:22.097 回答
5

在我看来,以下函数足够快,可以在传递ARGB颜色的同时返回ABGR颜色,反之亦然!

int argbToABGR(int argbColor) {
    int r = (argbColor >> 16) & 0xFF;
    int b = argbColor & 0xFF;
    return (argbColor & 0xFF00FF00) | (b << 16) | r;
}
于 2017-02-09T09:55:36.790 回答