将BGRA转换为ARGB

我正在阅读本教程获取iPhone相机的像素数据。

虽然我没有运行和使用这个代码的问题,我需要把摄像头数据(它来自BGRA)的输出,并将其转换为ARGB,以便我可以使用它与外部库。 我该怎么做呢?

如果您使用的是iOS 5.0,则可以在Accelerate框架中使用vImage,使用以下代码(从Apple的WebCore源代码中提取)执行NEON优化的颜色组件交换:

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); 

其中widthheightsrcBytesPerRow是通过CVPixelBufferGetWidth()CVPixelBufferGetHeight()CVPixelBufferGetBytesPerRow()从像素缓冲区获得的。 srcRows将是指向像素缓冲区中字节基址的指针, destRows将是您分配用于保存输出RGBA图像的内存。

这应该比简单地遍历字节和交换颜色组件要快得多。

根据图像大小,更快的解决scheme是将帧上传到OpenGL ES,渲染一个简单的矩形作为纹理,并使用glReadPixels()来下拉RGBA值。 更好的办法是使用iOS 5.0的纹理caching进行上传和下载,这个过程对于iPhone 4上的720p帧只需要1-3毫秒。当然,使用OpenGL ES意味着需要更多的支持代码这关。