ios - 将 BGRA 转换为 ARGB

标签 ios core-graphics avcapturesession avcam

我正在阅读 this tutorial关于从 iPhone 相机获取像素数据。

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

最佳答案

如果您使用的是 iOS 5.0,则可以使用 Accelerate 框架内的 vImage 使用如下代码(取自 Apple 的 WebCore source code)进行 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 图像的内存。

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

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

关于ios - 将 BGRA 转换为 ARGB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10654909/

相关文章:

ios - captureOutput :didOutputSampleBuffer:from connection: 中的方向问题

ios - 如何使用 Swift 3 在 iOS 10 上隐藏状态栏及其内容?

ios - 坠落效果 - 在 z 轴上移动

ios - CGContextClipToMask 可以用 alpha=1 屏蔽所有非透明像素吗?

iphone - UIView 框架边界为 0,0

ios - 视觉框架为捕获的视频输出帧中的矩形提供不正确的坐标

ios - 在 plist 文件中存储值时出错

ios - 在 "for"循环中使用 NSURL URLWithString 时应用程序崩溃

ios - 如果调用 layoutIfNeeded(),UIView 约束将不会动画

iphone - 如何在 iPhone 上以编程方式绘制椭圆形气泡?