Convertir BGRA a ARGB

Estoy leyendo este tutorial sobre cómo get datos de píxeles de la camera del iPhone.

Si bien no tengo problemas para ejecutar y usar este código, necesito tomar la salida de los datos de la camera (que viene en BGRA) y convertirlos a ARGB para que pueda usarlos con una biblioteca externa. ¿Cómo hago esto?

Si está utilizando iOS 5.0, puede usar vImage dentro del marco de trabajo de Accelerate para realizar un intercambio de componentes de color optimizado por NEON utilizando un código como el siguiente (extraído del código fuente WebCore de Apple):

vImage_Buffer src; src.height = height; src.width = width; src.rowBytes = srcBytesPerRow; src.data = srcRows; vImage_Buffer dest; dest.height = height; dest.width = width; dest.rowBytes = destBytesPerRow; dest.data = destRows; // Swap pixel channels from BGRA to RGBA. const uint8_t map[4] = { 2, 1, 0, 3 }; vImagePermuteChannels_ARGB8888(&src, &dest, map, kvImageNoFlags); 

donde width , height y srcBytesPerRow se obtienen de su búfer de píxeles a través de CVPixelBufferGetWidth() , CVPixelBufferGetHeight() y CVPixelBufferGetBytesPerRow() . srcRows sería el puntero a la dirección base de los bytes en el búfer de píxeles, y destRows sería la memory que ha asignado para mantener la image RGBA de salida.

Esto debería ser mucho más rápido que simplemente iterar sobre los bytes e intercambiar los componentes de color.

Dependiendo del tamaño de la image, una solución aún más rápida sería cargar el marco en OpenGL ES, renderizar un rectángulo simple con esta como textura y usar glReadPixels () para networkingucir los valores de RGBA. Mejor sería utilizar cachings de textura de iOS 5.0 tanto para upload como para download, donde este process solo lleva 1-3 ms para un marco de 720p en un iPhone 4. Por supuesto, usar OpenGL ES significa mucho más código de soporte para tirar esto esta apagado