LoginSignup
12
3

More than 3 years have passed since last update.

[swift] CVPixelBufferからCGImage、UIImageへ変換する

Last updated at Posted at 2020-08-16

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 }

参考

How to turn a CVPixelBuffer into a UIImage?

12
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
3