iOSでカメラを扱うとき、ところどころにcvPixelBufferが出てきますが、表示させたりフィルターをかけようとしたらCGImageやUIImage等に変換する必要があります。
そこで本記事ではCVPixelBufferからCGImageやUIImageに変換する方法をまとめておきます。
CVPixelBuffer→CGImage
VideoToolbox
ライブラリのVTCreateCGImageFromCVPixelBuffer
という関数を使用します。
import VideoToolbox
var cgImage: CGImage?
VTCreateCGImageFromCVPixelBuffer(pixelBuffer, options: nil, imageOut: &cgImage)
ちなみにswift4.2ではoptions:
の引数名は省略可能です。
CVPixelBuffer→UIImage
CVPixelBufferからCGImageに変換し、CGImageからUIImageを生成するExtensionです。
これは結構使える場面が多いので便利です。
extension UIImage {
public convenience init?(pixelBuffer: CVPixelBuffer) {
var cgImage: CGImage?
VTCreateCGImageFromCVPixelBuffer(pixelBuffer, options: nil, imageOut: &cgImage)
guard let cgImage = cgImage else {
return nil
}
self.init(cgImage: cgImage)
}
}
[補足1] CVPixelBuffer→CIImage
ちなみにCVPixelBufferからCIImageへの変換は簡単です。CIImageをinitializerで生成できます。
let ciImage = CIImage(cvPixelBuffer: imageBuffer)
[補足2] CVPixelBuffer→CIImage→CGImage
一度CIImageに変換すれば、CIContextを使用してCGImageに変換することも可能です。
let ciImage = CIImage(cvPixelBuffer: imageBuffer)
let w = CGFloat(CVPixelBufferGetWidth(imageBuffer))
let h = CGFloat(CVPixelBufferGetHeight(imageBuffer))
let rect:CGRect = CGRect.init(x: 0, y: 0, width: w, height: h)
let context = CIContext.init()
guard let cgImage = context.createCGImage(ciImage, from: rect) else { return }