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

IntBuffer用来操纵位图的像素,但缓冲区中的值应为 ,而颜色常量为

。我知道我可以使用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

}

回答:

由于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的快速算法? 的全部内容, 来源链接: utcz.com/qa/426235.html

回到顶部