首页 > 解决方案 > 将 pixelBuffer(kCVPixelFormatType_420YpCbCr8Planar) 转换为 CIImage

问题描述

现在我正在尝试将 pixelBuffer 转换为 CIImage,但失败了。

当pixelBuffer类型为kCVPixelFormatType_420YpCbCr8BiPlanarFullRange时,以下代码可以正常执行。

let sourceImage = CIImage.init(cvPixelBuffer: imageBuffer, options: nil)

但是,当 pixelBuffer 类型为 kCVPixelFormatType_420YpCbCr8Planar 时,它会失败。

日志如下。

[api] -[CIImage initWithCVPixelBuffer:options:] failed because its pixel format y420 is not supported.

因此,我想知道如何转换 pixelBuffer 类型或将 pixelBuffer(kCVPixelFormatType_420YpCbCr8Planar) 转换为 CIImage。

请教我。

标签: iosswiftyuvciimagecvpixelbuffer

解决方案


查看vImageConverter

有了这个,您可以转换为 ARGB8888vImageConvert_420Yp8_CbCr8ToARGB8888 并创建一个vImage_Buffer

转换矩阵示例

/// This is the YCbCr to RGB conversion opaque object used by the convert function.
private var conversionMatrix: vImage_YpCbCrToARGB = {
    var pixelRange = vImage_YpCbCrPixelRange(Yp_bias: 0, CbCr_bias: 128, YpRangeMax: 255, CbCrRangeMax: 255, YpMax: 255, YpMin: 1, CbCrMax: 255, CbCrMin: 0)
    var matrix = vImage_YpCbCrToARGB()
    vImageConvert_YpCbCrToARGB_GenerateConversion(kvImage_YpCbCrToARGBMatrix_ITU_R_709_2, &pixelRange, &matrix, kvImage420Yp8_CbCr8, kvImageARGB8888, UInt32(kvImageNoFlags))
    return matrix
}()

示例代码:CapturedImageSampler.swift


推荐阅读