2

I have a simple function to create CGImage from CVPixelBuffer:

if let buffer = (results as? [VNPixelBufferObservation])?.first {
    let pixelBuffer = buffer.pixelBuffer
    let ciImage = CIImage(cvPixelBuffer: pixelBuffer)
    let resultImage = UIImage(ciImage: ciImage)
    return resultImage.cgImage //returns nil
}

But it returns nil. Why?

Asif Mujtaba
  • 447
  • 6
  • 17
Bartłomiej Semańczyk
  • 59,234
  • 49
  • 233
  • 358

2 Answers2

4

The output is nil because you are creating the UIImage instance with a CIImage not CGImage. Here is a way to create a CGImage:

func createCGImage(from pixelBuffer: CVPixelBuffer) -> CGImage? {
   let ciContext = CIContext()
   let ciImage = CIImage(cvImageBuffer: pixelBuffer)
   return ciContext.createCGImage(ciImage, from: ciImage.extent)
}
bugloaf
  • 2,890
  • 3
  • 30
  • 49
Asteroid
  • 1,049
  • 2
  • 8
  • 16
0

Try this one

import VideoToolbox
func createImage(from pixelBuffer: CVPixelBuffer) -> CGImage? {
    var cgImage: CGImage?
    VTCreateCGImageFromCVPixelBuffer(pixelBuffer, options: nil, imageOut: &cgImage)
    return cgImage
}