2012-09-06 19 views
6

estoy usando IntBuffer para manipular los píxeles de un mapa de bits, pero el valor en la memoria intermedia debería haber AABBGGRR, mientras que las constantes de color son aarrggbb. Sé que puedo usar Color.argb, Color.a, ... para invertir, pero creo que no es perfecto.Algoritmo rápido para invertir un valor de color ARGB en ABGR?

Necesito manipular una gran cantidad de píxeles, por lo que necesito un algoritmo que pueda realizar este operador en poco tiempo. Creo que de esta expresión de bits, pero no es correcta:

0xFFFFFFFF^pSourceColor 

Si no hay uno mejor, tal vez voy a utilizar operadores de bits de desplazamiento (que realiza Color.a, ...) en lugar de llamar a las funciones para reducir el hora.

EDIT:

Ésta es mi función actual para convertir, aunque creo que hay Shoul ser un mejor algoritmo (menos operadores) para llevarla a cabo:

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

posible duplicado de [Cómo convertir RGB a BGR?] (Http://stackoverflow.com/questions/3041499/how-to-convert-rgb-to-bgr) –

+0

No, solamente ese tema discutir sobre RGB. Y las buenas respuestas están usando bit shift para obtener rojo, verde, azul. Mi problema es más avanzado, ya que Alpha no cambia de posición. –

+0

1) No hay forma de resolver esto (de manera efectiva) sin usar el cambio de bits y 2) La mejor manera de hacerlo es en esa respuesta. En su caso, simplemente guarde el alfa, desplácelo y luego agréguelo al final. –

Respuesta

8

Desde A y G están en lugar, probablemente puedas hacerlo un poco mejor enmascarando el B y el R y luego volviéndolos a agregar. no lo he probado, pero debe ser del 95% en lo correcto:

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

Gracias. Esto es lo que estoy buscando! –

2

En mi opinión, la siguiente función es lo suficientemente rápido como para devolver el color de ABGR al pasar un ARGB color y vice- ¡versa!

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