6

私はIntBufferビットマップのピクセルを操作するために使用していますが、色定数がAARRGGBBであるのに対し、バッファの値はAABBGGRRである必要があります。、、 ...を使用して反転できることはわかっていますが、完全ではないと思います。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
}
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 に答える