【问题标题】:Converting BGRA to ARGB将 BGRA 转换为 ARGB
【发布时间】:2012-05-19 03:31:16
【问题描述】:

我正在阅读this tutorial 从 iPhone 摄像头获取像素数据。

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

【问题讨论】:

  • 您是否尝试请求其他格式?
  • 是的,我做到了;看来,至少对于最新的 iOS,不幸的是,在请求 32 位 ARGB 格式时会引发异常。具体来说就是不支持 ARGB。

标签: ios core-graphics avcapturesession avcam


【解决方案1】:

如果您使用的是 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 上,这个过程只需要 1-3 毫秒即可处理 720p 帧。当然,使用 OpenGL ES 意味着要提取更多支持代码关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-04
    • 2012-02-04
    • 2011-01-23
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多