【iOS】AVFoundationを使用してRAW撮影機能を実装する
AVFoundationのAPIを使用して、RAW及びApple ProRAW撮影機能を実装する方法について書きます。
写真撮影を行うAPI
写真撮影を行うには、capturePhoto(with:delegate:)
を実行します。
with
引数には、AVCapturePhotoSettings
オブジェクトを指定します。RAW及びApple ProRAW形式で撮影を行うには、AVCapturePhotoSettings
オブジェクトの生成部分がポイントになります。
AVCapturePhotoSettingsとは
AVCapturePhotoSettings
は、撮影を行う時に使用する機能や、撮影する写真のフォーマット情報を指定することができるクラスです。例えば、写真撮影時のフラッシュ設定や、撮影する写真のフォーマットを指定することができます。RAW及びApple ProRAW形式で撮影を行う時は、このAVCapturePhotoSettings
にフォーマット情報を定義します。
RAW撮影用のAVCapturePhotoSettings生成
以下のコードでは、RAW / JPEG (RAW+L)形式で撮影を行う時のAVCapturePhotoSettings
オブジェクトを生成しています。
isAppleProRAWEnabled
isAppleProRAWEnabled
にtrue
を代入すると、Apple ProRAW形式で撮影を行うことができます。Apple ProRAW形式の撮影をサポートしているデバイスでは、isAppleProRAWSupported
にはtrue
が格納されています。
availableRawPhotoPixelFormatTypes
availableRawPhotoPixelFormatTypes
を使用して、RAW撮影をサポートするピクセルフォーマットを取得しています。AVCapturePhotoSettings
イニシャライザのrawPixelFormatType
引数に取得したピクセルフォーマットを、processedFormat
引数に圧縮済み写真のフォーマットを指定して、AVCapturePhotoSettings
オブジェクトを生成しています。
rawEmbeddedThumbnailPhotoFormat
RAW写真は出力されるまで大きな時間を要します。RAW写真を撮影後、撮影した写真をすぐに確認できるようにするためには、AVCapturePhotoSettings
のrawEmbeddedThumbnailPhotoFormat
にプレビュー用画像のフォーマットを指定します。
RAW + JPEG (RAW+L)写真の生成
RAW / JPEG (RAW+L)形式で撮影を行うためのAVCapturePhotoSettings
を、capturePhoto(with:delegate:)
の引数に指定して実行すると、RAW + JPEG (RAW+L)形式の写真生成処理が開始します。それぞれの形式の写真が出力される度に、photoOutput(_:didFinishProcessingPhoto:error:)
がコールされます。引数photo
のisRawPhoto
を使用することで、生成された写真がRAW写真か否かを確認することができます。RAW写真はtemporaryDirectory
に保存しておき、JPEG写真のデータは変数で保持しておきます。
RAW + JPEG (RAW+L)写真の保存
PhotoKitのperformChanges(_:completionHandler:)
を使用して、RAW + JPEG (RAW+L)写真を写真ライブラリに保存します。completionHandler
引数に指定したクロージャ内に具体的な保存処理を記述します。
PHAssetCreationRequest
のaddResource(with:data:options:)
は写真やビデオを写真ライブラリに保存するためのメソッドです。
with
引数には.photo
、data
引数にはJPEG写真のデータを格納したData
オブジェクトを指定することで、JPEG写真を写真ライブラリに保存することができます。
さらに、このJPEG写真とペアでRAW写真を保存するために、もう一度addResource(with:data:options:)
を実行します。with
引数には.alternatePhoto
、data
引数にはRAW写真のデータを配置しているURL
オブジェクトを指定することで、RAW写真を写真ライブラリに保存することができます。
このとき、shouldMoveFile
にtrue
を代入しておくことで、RAW写真を写真ライブラリに保存した後に、temporaryDirectory
に保存していたRAW写真が自動的に削除されるようになります。
ここまでの処理を行うと、RAW + JPEG (RAW+L)写真を写真ライブラリに保存することができます。
参考資料
・Capture and process ProRAW images
・Advances in iOS Photography
Discussion