2012-09-06 7 views
6

mi stosując IntBuffer manipulować piksele mapy bitowej, przy czym wartość w buforze powinny być AABBGGRR, a stałe koloru są AARRGGBB. Wiem, że mogę użyć Color.argb, Color.a, ... odwrócić, ale myślę, że nie jest doskonały.Szybki algorytm odwracający wartość koloru ARGB na ABGR?

Potrzebuję manipulować bardzo dużą liczbą pikseli, więc potrzebuję algorytmu, który może wykonać ten operator w krótkim czasie. Myślę, że tego bitu wypowiedzi, ale to nie jest poprawne:

0xFFFFFFFF^pSourceColor 

Jeśli nie ma lepszego, może będę używać operatorów bit-shift (który wykonuje Color.a ...) zamiast wywoływania funkcji w celu zmniejszenia czas.

EDIT:

To moja obecna funkcja konwersji, choć myślę, że shoul być lepszy algorytm (mniej operatorzy), aby wykonać go:

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

możliwe duplikat [Jak przekonwertować RGB na BGR?] (Http://stackoverflow.com/questions/3041499/how-to-convert-rgb-to-bgr) –

+0

Nie, tylko, że wątek porozmawiaj o RGB. A dobre odpowiedzi w rzeczywistości używają przesunięcia bitowego, aby uzyskać czerwony, zielony, niebieski. Mój problem jest bardziej zaawansowany, ponieważ Alpha nie zmienia pozycji. –

+0

1) Nie ma sposobu, aby rozwiązać to (w sposób efektywny) bez użycia bitshifting i 2) Najlepszym sposobem na to jest w tej odpowiedzi. W twoim przypadku po prostu zapisz alfabet, przestaw go, a następnie dodaj ponownie na końcu. –

Odpowiedz

8

Od A i G są w miejsce, możesz prawdopodobnie zrobić trochę lepiej, maskując B i R, a następnie dodając je z powrotem. Nie testowałem go ale powinno być 95% rację:

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

Dziękuję. Tego właśnie szukam! –

2

Moim zdaniem, jest następująca funkcja wystarczająco szybko zwrócić ABGR kolor podczas przepuszczanie ARGB kolorów i wice- versa!

int argbToABGR(int argbColor) { 
    int r = (argbColor >> 16) & 0xFF; 
    int b = argbColor & 0xFF; 
    return (argbColor & 0xFF00FF00) | (b << 16) | r; 
} 
Powiązane problemy