繁体   English   中英

从 CVImageBuffer 创建 CGContext - 特定图像缓冲区大小的上下文为零

[英]Create CGContext from CVImageBuffer - Context is nil for specific image buffer sizes

当我尝试使用以下代码从 CVImageBuffer 创建 CGContext

func drawImage(image:CGImage, sampleBuffer: CMSampleBuffer){
    
    guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
        
        return
    }
    
    CVPixelBufferLockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: .zero))
    
    let width = CVPixelBufferGetWidth(pixelBuffer)
    let height = CVPixelBufferGetHeight(pixelBuffer)
    
    let context = CGContext(data: CVPixelBufferGetBaseAddress(pixelBuffer),
                            width: width,
                            height: height,
                            bitsPerComponent: 8,
                            bytesPerRow: CVPixelBufferGetBytesPerRow(pixelBuffer),
                            space: CGColorSpaceCreateDeviceRGB(),
                            bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedFirst.rawValue).union(.byteOrder32Little).rawValue)
    
    context?.draw(image, in: .init(origin: .zero, size: .init(width: 200, height: 200))) // sometime context is nil here
    
    CVPixelBufferUnlockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: .zero))
}

    

CGContext 为零,错误如下

CGBitmapContextCreate:无效数据字节/行:对于 8 个 integer 位/分量、3 个分量、kCGImageAlphaPremultipliedFirst,应至少为 8640。

注意:这只发生在特定的图像缓冲区大小,如 4k 等。1080p 和 720p 工作正常。

提前感谢您的帮助!

您是否尝试过使用imageWithCVPixelBuffer将像素缓冲区转换为 CIImage 并将其转换为 CGImage。 可能是像素缓冲区包含 YUV 数据而不是 RGBA。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM