iOS YUV 转换 RGB 时图像左边发生位移

最近在优化相机 YUV 420f 图像转换 RGB 图像的性能,踩到一个坑。

在 YUV 图像转换为 RGB 时,发现转换后的图像左边有一道位移,大概图像 1/20 的宽度从右边移到了左边,效果如下:

图1:发现位移的图像: image

图2:正常应该显示的图像: image

可以看到 图1 最左边跟 图2 不一样。

后来找到了原因,因为拿 YUV 图像内存地址的时候,我使用了下面这个函数:

uint8_t *srcAddress = (uint8_t *)CVPixelBufferGetBaseAddress(pixelBuffer);

使用这个函数获取内存地址有什么问题呢?查看一下官方文档后发现,对于 YUV 来说,这个函数返回的是一个 CVPlanarComponentInfo 的地址,而不是图像 (0,0) 位置的内存地址。因此对于 RGB 没有 Planar 的图像格式,使用上面的函数来获取 (0,0) 位置图像地址没问题,但是对于 YUV 就不行了。CVPlanarComponentInfo 应该是类似 MP3 音频文件头的东西,描述这个文件的内容。

所以对于 YUV,正确的做法是使用下面这个函数,获取图像内存地址:

uint8_t *srcAddress = (uint8_t *)CVPixelBufferGetBaseAddress(pixelBuffer);

问题得到解决。

Posted 2018-07-18

More writing at jakehao.com