2012-09-06 18 views
6

Ich verwende IntBuffer Pixel einer Bitmap zu manipulieren, aber der Wert im Puffer sollte AABBGGRR, während die Farbkonstanten sind aarrggbb sein. Ich weiß, ich kann Color.argb, Color.a, ... zu invertieren, aber ich denke, es ist nicht perfekt.Schneller Algorithmus zum Invertieren eines ARGB-Farbwerts in ABGR?

Ich muss eine sehr große Anzahl von Pixeln manipulieren, also brauche ich einen Algorithmus, der diesen Operator in kurzer Zeit ausführen kann. Ich denke, dieses Bit-Ausdruck, aber es ist nicht korrekt:

0xFFFFFFFF^pSourceColor 

Wenn niemand da ist besser, vielleicht werde ich Bit-Shift-Operatoren verwenden (das führt Color.a, ...) statt, die Funktionen des Aufrufs der reduzieren Zeit.

EDIT:

Dies ist meine aktuelle Funktion zu konvertieren, obwohl ich es denke shoul einen besseren Algorithmus (weniger Betreiber) sein, es auszuführen:

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 
} 
+1

möglich Duplikat von [Wie RGB BGR-Format konvertieren?] (Http://stackoverflow.com/questions/3041499/how-to-convert-rgb-to-bgr) –

+0

Nein, nur das Thema Diskutiere über RGB. Und die guten Antworten verwenden Bit-Shift, um Rot, Grün und Blau zu erhalten. Mein Problem ist fortgeschrittener, da Alpha die Position nicht wechselt. –

+0

1) Es gibt keine Möglichkeit, dies (in einer performanten Weise) zu lösen, ohne Bitshifting zu verwenden und 2) Der beste Weg, dies zu tun, ist in dieser Antwort. In Ihrem Fall speichern Sie einfach das Alpha, verschieben es und fügen es am Ende wieder hinzu. –

Antwort

8

Da A und G sind in Ort, Sie können wahrscheinlich ein wenig besser tun, indem Sie die B und R maskieren und dann wieder hinzufügen. Habe es nicht getestet, aber sollte 95% richtig sein:

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; 
} 
+0

Danke. Das ist was ich suche! –

2

Meiner Meinung nach, ist die folgende Funktion schnell genug die ABGR Farbe zurückzukehren, während eine ARGB Farbe und Vize- vorbei versa!

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