[SwiftUI][AVFoundation] AVCaptureSession から写真を取得する方法

SwiftUI&AVFoundation

AVCaptureSession と AVCaptureVidePreviewView を使って、カメラのプレビューを表示できるようになったので、シャッターボタンを押された時に、プレビューに表示されている画像を取得する方法を説明します。

AVCapturePhotoOutputと取り出す手順

AVCaptureSession を使って表示している画像を取り出すためには、AVCapturePhotoOutput を使用します。

取り出すためには以下の手順が必要となります。

AVCaptureSession と Input を設定し、プレビューできるようにする
前回の記事で説明しました。
AVCapturePhotoOutput を準備して、AVCaptureSession の Output に設定する
AVCapturePhotoOutput をインスタンス化して、AVCaptureSession の Output に設定します。
AVCapturePhotoOutput#capturePhoto で画像取得リクエストを発行
画像データは、関数返り値ではなく、Delegate(AVCapturePhotoCaptureDelegate) に渡されます
AVCapturePhotoCaptureDelegate#photoOutput で取得し、処理する
引数の photo に AVCapturePhoto タイプのデータとして渡されますので、処理します

それでは、それぞれのステップをみていきます。

AVCaptureSession と Input を設定し、プレビューできるようにする

以前の記事で説明した通りです。

AVCapturePhotoOutput を準備して、AVCaptureSession の Output に設定する

以下のように、AVCapturePhotoOutput をインスタンス化し、AVCaptureSession の Output に設定します。

この段階で詳細な設定は不要です。

AVCapturePhotoOutput を AVCaptureSession に設定

AVCapturePhotoOutput#capturePhoto で画像取得リクエストを発行

AVCaputurePhotoOutput#capturePhoto 関数によって、画像取得のリクエストを発行できます。

リクエスト時に、Delegate を渡して、処理されたデータはその Delegate に渡されてきます。

また、リクエスト時には撮影設定を、AVCapturePhotoSettings として渡す必要があります。

以下のようなコードとなります。

capturePhoto をコール

AVCapturePhotoCaptureDelegate#photoOutput で取得し、処理する

処理が終われば、Delegate の photoOutput がコールされますので、その中で処理します。

以下では、UIImage を作成しています。

AVCapturePhoto から UIImage

サンプルコード

capturePhoto がAVsession の Output に設定されたオブジェクトの関数なので、キャプチャーする機能性をもつ外部オブジェクトとして AVCaptureModel というものを作成し、保持するようにしました。

アプリの動作としては、ボタンを押されると取得したUIImageをプレビューとは別に表示するようにしました。

beforeButtonPush

afterbuttonPush

画像の向きがおかしいのは、UIImageを表示する時に、デバイスの方向を考慮していないからです。

アプリケーションのコードは以下です。

AVCaptureModel.swift
SwiftUIAVCaptureVidePreviewView.swift
ContentView.swift

まとめ:AVSession を使ったプレビューから画像を取得するのは、非常に簡単です

画像を取得するのは非常に簡単なのですが、詳細なセッティングは、沼になっていそうです。

AVCapturePhotoSettings の詳細は、非常に多そうです。

説明は以上です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です