将 BGRA 转换为 ARGB



我正在阅读本教程,了解如何从iPhone相机获取像素数据。

虽然我在运行和使用此代码时没有问题,但我需要获取相机数据的输出(BGRA 中提供(并将其转换为 ARGB,以便我可以将其与外部库一起使用。我该怎么做?

如果您使用的是 iOS 5.0,则可以在加速框架中使用 vImage 来执行霓虹灯优化的颜色分量交换,使用如下代码(提取自 Apple 的 WebCore 源代码(:

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 图像的内存。

这应该比简单地迭代字节和交换颜色分量要快得多。

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

最新更新