🎆

【iOS】AVFoundationを使用してRAW撮影機能を実装する

2023/10/20に公開

AVFoundationのAPIを使用して、RAW及びApple ProRAW撮影機能を実装する方法について書きます。

写真撮影を行うAPI

写真撮影を行うには、capturePhoto(with:delegate:) を実行します。
https://developer.apple.com/documentation/avfoundation/avcapturephotooutput/1648765-capturephoto

with 引数には、AVCapturePhotoSettings オブジェクトを指定します。RAW及びApple ProRAW形式で撮影を行うには、AVCapturePhotoSettings オブジェクトの生成部分がポイントになります。

AVCapturePhotoSettingsとは

AVCapturePhotoSettings は、撮影を行う時に使用する機能や、撮影する写真のフォーマット情報を指定することができるクラスです。例えば、写真撮影時のフラッシュ設定や、撮影する写真のフォーマットを指定することができます。RAW及びApple ProRAW形式で撮影を行う時は、このAVCapturePhotoSettings にフォーマット情報を定義します。

RAW撮影用のAVCapturePhotoSettings生成

以下のコードでは、RAW / JPEG (RAW+L)形式で撮影を行う時のAVCapturePhotoSettings オブジェクトを生成しています。

isAppleProRAWEnabled

isAppleProRAWEnabledtrue を代入すると、Apple ProRAW形式で撮影を行うことができます。Apple ProRAW形式の撮影をサポートしているデバイスでは、isAppleProRAWSupported にはtrue が格納されています。

availableRawPhotoPixelFormatTypes

availableRawPhotoPixelFormatTypes を使用して、RAW撮影をサポートするピクセルフォーマットを取得しています。AVCapturePhotoSettings イニシャライザのrawPixelFormatType 引数に取得したピクセルフォーマットを、processedFormat 引数に圧縮済み写真のフォーマットを指定して、AVCapturePhotoSettings オブジェクトを生成しています。

rawEmbeddedThumbnailPhotoFormat

RAW写真は出力されるまで大きな時間を要します。RAW写真を撮影後、撮影した写真をすぐに確認できるようにするためには、AVCapturePhotoSettingsrawEmbeddedThumbnailPhotoFormat にプレビュー用画像のフォーマットを指定します。

RAW + JPEG (RAW+L)写真の生成

RAW / JPEG (RAW+L)形式で撮影を行うためのAVCapturePhotoSettings を、capturePhoto(with:delegate:) の引数に指定して実行すると、RAW + JPEG (RAW+L)形式の写真生成処理が開始します。それぞれの形式の写真が出力される度に、photoOutput(_:didFinishProcessingPhoto:error:) がコールされます。引数photoisRawPhoto を使用することで、生成された写真がRAW写真か否かを確認することができます。RAW写真はtemporaryDirectory に保存しておき、JPEG写真のデータは変数で保持しておきます。

RAW + JPEG (RAW+L)写真の保存

PhotoKitのperformChanges(_:completionHandler:) を使用して、RAW + JPEG (RAW+L)写真を写真ライブラリに保存します。completionHandler 引数に指定したクロージャ内に具体的な保存処理を記述します。
PHAssetCreationRequestaddResource(with:data:options:) は写真やビデオを写真ライブラリに保存するためのメソッドです。
with 引数には.photodata 引数にはJPEG写真のデータを格納したData オブジェクトを指定することで、JPEG写真を写真ライブラリに保存することができます。
さらに、このJPEG写真とペアでRAW写真を保存するために、もう一度addResource(with:data:options:)を実行します。with 引数には.alternatePhotodata 引数にはRAW写真のデータを配置しているURL オブジェクトを指定することで、RAW写真を写真ライブラリに保存することができます。
このとき、shouldMoveFiletrue を代入しておくことで、RAW写真を写真ライブラリに保存した後に、temporaryDirectory に保存していたRAW写真が自動的に削除されるようになります。
ここまでの処理を行うと、RAW + JPEG (RAW+L)写真を写真ライブラリに保存することができます。

参考資料

・Capture and process ProRAW images
https://developer.apple.com/videos/play/wwdc2021/10160/

・Advances in iOS Photography
https://developer.apple.com/videos/play/wwdc2016/501/

Discussion