iOS上此图像的正确色彩空间转换是什么?

时间:2015-06-08 08:37:30

标签: ios image avfoundation rgb yuv

我们如何修复下面的代码,以便从我们传入的sampleBuffer中为您在下面看到的图像正确着色?

我们正在尝试将传入的sampleBuffer图像转换为UIImage,但结果是您在下面看到的反色背景图像。

您可以看到我们尝试在代码中使用kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange选项 - 但结果是相同的。

我们试图显示的传入图像具有所有正确的颜色,如果我们将图像渲染到GLKView中,所有颜色都在那里。

这可能是YUV420转换问题吗?

以下是我们使用的转换代码:

- (CGImageRef) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer // Create a CGImageRef from sample buffer data
{
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    CVPixelBufferLockBaseAddress(imageBuffer,0);        // Lock the image buffer

    uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0);   // Get information of the image
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
    size_t width = CVPixelBufferGetWidth(imageBuffer);
    size_t height = CVPixelBufferGetHeight(imageBuffer);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    // CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);

    CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange | kCGImageAlphaPremultipliedFirst);



    CGImageRef newImage = CGBitmapContextCreateImage(newContext);
    CGContextRelease(newContext);

    CGColorSpaceRelease(colorSpace);
    CVPixelBufferUnlockBaseAddress(imageBuffer,0);
    /* CVBufferRelease(imageBuffer); */  // do not call this!

    return newImage;
}

以下是我们用于传入CVPixelBuffer的设置代码:

// Now create the CVPixelBuffer to which we will render
    CVReturn retVal = CVPixelBufferCreate(kCFAllocatorDefault,
                                          self.screenWidth,
                                          self.screenHeight,
                                          kCVPixelFormatType_32BGRA,
                                          attrs,
                                          &_outputRenderTarget);

Inverted Image
有关尝试恢复和显示所有正确颜色的建议吗?

2 个答案:

答案 0 :(得分:0)

除了您需要换回注释/未注释的行之外,显示的代码没有问题。

我会后退一步,查看将数据写入传入缓冲区的内容。例如,我使用AVAssetReaderVideoCompositionOutput对象来生成样本缓冲区。视频合成对象的初始化具有与用于创建传入cvpixelbuffer以及cgimage和位图兼容性密钥的视频设置相匹配。

答案 1 :(得分:0)

事实证明我们用1-r,1-g,1-b反转所有颜色。

一旦我们移除了反转,颜色再次显示正常。