我正在读取从iPhone摄像头获取像素数据的this tutorial。
虽然我运行和使用这段代码没有问题,但我需要获取相机数据(以BGRA格式提供)的输出,并将其转换为ARGB,以便我可以将其与外部库一起使用。我该怎么做呢?
发布于 2012-05-19 03:31:17
如果您使用的是iOS 5.0,您可以在Accelerate框架中使用vImage,使用如下代码(取自苹果的WebCore source code)进行霓虹灯优化的颜色分量交换:
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()从像素缓冲区获取的。RGBA将是指向像素缓冲区中字节的基地址的指针,而destRows将是为保存输出srcRows图像而分配的内存。
这应该比简单地迭代字节和交换颜色分量要快得多。
根据图像大小的不同,更快的解决方案是将帧上载到OpenGL ES,渲染一个简单的矩形并将其作为纹理,然后使用glReadPixels()下拉RGBA值。更好的办法是使用iOS 5.0的纹理缓存进行上传和下载,在iPhone 4上,720p的帧只需要1-3毫秒。当然,使用OpenGL ES意味着更多的支持代码来实现这一点。
https://stackoverflow.com/questions/10654909
复制相似问题