从iOS6开始,苹果公司提供了通过以下调用使用本地YUV到CIImage的选项:
initWithCVPixelBuffer:options:
在核心图像编程指南中,他们提到了这个特性
利用iOS 6.0及更高版本对YUV图像的支持。相机像素缓冲区本机为YUV格式,但大多数图像处理算法期望的是RGBA数据。在两者之间进行转换的代价是很高的。Core Image支持从CVPixelBuffer对象读取YUB并应用适当的颜色转换。
options = @{ (id)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_420YpCvCr88iPlanarFullRange) };
但是,我无法正确使用它。我有原始的YUV数据。所以,这就是我所做的。
void *YUV[3] = {data[0], data[1], data[2]};
size_t planeWidth[3] = {width, width/2, width/2};
size_t planeHeight[3] = {height, height/2, height/2};
size_t planeBytesPerRow[3] = {stride, stride/2, stride/2};
CVPixelBufferRef pixelBuffer = NULL;
CVReturn ret = CVPixelBufferCreateWithPlanarBytes(kCFAllocatorDefault,
width,
height,
kCVPixelFormatType_420YpCbCr8PlanarFullRange,
nil,
width*height*1.5,
3,
YUV,
planeWidth,
planeHeight,
planeBytesPerRow,
nil,
nil, nil, &pixelBuffer);
NSDict *opt = @{ (id)kCVPixelBufferPixelFormatTypeKey :
@(kCVPixelFormatType_420YpCbCr8PlanarFullRange) };
CIImage *image = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer options:opt];
我的图片获取到的是nil。有任何想法我可能遗漏了什么吗?
编辑:我在调用之前添加了锁定和解锁基地址。此外,我转储了像素缓冲区的数据以确保像素缓冲区正确地保存了数据。看起来只有初始化调用出了问题。但CIImage对象仍然返回nil。
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
CIImage *image = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer options:opt];
CVPixelBufferUnlockBaseAddress(pixelBuffer,0);