将 BGRA 转换为 ARGB
-
11-12-2019 - |
题
我正在阅读 本教程 从 iPhone 相机获取像素数据。
虽然我运行和使用此代码没有问题,但我需要获取相机数据的输出(以 BGRA 形式)并将其转换为 ARGB,以便我可以将其与外部库一起使用。我该怎么做呢?
解决方案
如果您使用的是 iOS 5.0,则可以使用 Accelerate 框架中的 vImage 来执行 NEON 优化的颜色组件交换,使用如下代码(取自 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);
在哪里 width
, height
, , 和 srcBytesPerRow
是从你的像素缓冲区获得的 CVPixelBufferGetWidth()
, CVPixelBufferGetHeight()
, , 和 CVPixelBufferGetBytesPerRow()
. srcRows
将是指向像素缓冲区中字节基地址的指针,并且 destRows
将是您分配用于保存输出 RGBA 图像的内存。
这应该比简单地迭代字节并交换颜色分量要快得多。
根据图像大小,更快的解决方案是将帧上传到 OpenGL ES,用它作为纹理渲染一个简单的矩形,然后使用 glReadPixels() 下拉 RGBA 值。更好的是使用 iOS 5.0 的纹理缓存进行上传和下载,对于 iPhone 4 上的 720p 帧,此过程只需要 1-3 毫秒。当然,使用 OpenGL ES 意味着需要更多的支持代码来实现这一目标。
不隶属于 StackOverflow