-
高解像度の写真キャプチャの実装
AVFoundationを使うと、アプリ内で超高解像度の写真を撮影できます。画像をキャプチャする際に、RAW、露出ブラケット、フル処理の3つのオプションを使い分けるタイミングを学びましょう。メインカメラ、望遠カメラ、超広角カメラで24MPおよび48MP画像の写真キャプチャを設定する方法を確認します。また、多くの写真を撮影してもアプリの応答性が維持されるようにする、写真の遅延処理についても解説します。
関連する章
- 0:00 - Introduction
- 0:52 - High-resolution photos
- 4:07 - Types of captures
- 5:20 - Configure a capture session
- 9:41 - Responsive capture best practices
リソース
関連ビデオ
WWDC26
WWDC23
WWDC21
-
このビデオを検索
こんにちは Mohit Setiaです Camera Softwareチームのエンジニアです 「高解像度写真撮影の実装」へ ようこそ カメラハードウェアの進化と コンピュテーショナルフォトグラフィにより 高解像度撮影が可能になりました この品質をフル活用するには トレードオフの管理が必要です 特に処理時間と 最終画質のバランスです 高品質な写真処理について 説明します アプリのトレードオフを 管理する方法もご紹介します まず高解像度写真の 各タイプを説明します
次に設定と撮影方法を説明します 最後にプロセス全体を通じて アプリをレスポンシブに保つ方法を紹介します まず高解像度写真についてです プレビューストリームは スクリーン解像度の画像を提供します カメラのビューを表示するのに 適しています 写真撮影では高レベルの ディテールと低ノイズが求められます
高解像度画像は 写真のトリミングにも必要です ディテールのズームや 画像解析にも欠かせません 高解像度撮影がこれを実現します 定義を説明しましょう 高解像度写真は通常12メガピクセルで プレビューストリームより高い解像度で シーンを撮影します
24メガピクセルと48メガピクセルは さらに上を行きます カメラはさらに大きな 解像度で撮影します より多くのディテールと 鮮明さが得られます iPhone 14 Proと iPhone 14 Pro Maxから カメラシステムに48メガピクセルの Quadセンサーが搭載されました クアッドピクセルセンサー設計により フル解像度での撮影が可能です 最高レベルのディテールを 実現します または同色の2×2クラスターにピクセルを まとめより多くの光を取り込めます これはiPhoneで撮影した 48メガピクセルの写真です 海岸線の広大な風景が 映っています 崖、ビーチ、水平線まで 続く海が広がっています 標準写真の4倍の解像度です センサーからの1フレームで 撮影されています 海岸の100%クロップには 細かい岩が映っています 驚くほどの精細さで はっきりと確認できます 山の斜面にある 複雑なパターンも分かります これが48メガピクセルの力です より多くのディテール、鮮明さ そして探索できる情報が増えます iPhone 15から、カメラは 24メガピクセル写真に対応しました 24メガピクセルの写真撮影は 複数のステップで構成されます まずカメラはQuadセンサーの 結合ピクセルを使用します 12メガピクセルのマルチフレーム 合成HDR画像を生成します 次にPhotonic Engineと呼ばれる コンピュテーショナル画像処理パイプラインが 高解像度48MP画像と 組み合わせます フルセンサー解像度で撮影した 豊かなディテールを持つ画像です
結果は驚くほどの品質の 24MP画像になります 12MP画像の2倍の解像度です ファイルサイズの増加は 約50%にとどまります 光とディテールのバランスを 取りながら 保存や共有に適した ファイルサイズを維持します iPhone 15から、カメラアプリは このモードがデフォルトです 24MPと48MPの 撮影サポートが拡張されました iPhone 16 Proの望遠カメラと iPhone 17の超広角カメラに対応しました 以上がiPhoneカメラで利用可能な 高解像度写真のタイプです iPhoneで利用可能な 高解像度写真の定義が分かりました 次はアプリでリクエストできる 高解像度撮影のタイプです まず最も一般的なケース 完全処理済み写真です これはマルチフレーム合成画像です Photonic Engineを通過し ダイナミックレンジを拡張して 細かいディテールを改善します
2つ目はExposureブラケットです 同じシーンの 複数の露出フレームです ハイダイナミックレンジ写真の 作成に役立ちます 複数の露出から選択が必要な シナリオにも使えます 3つ目はBayer RAW写真です RAWはセンサーから直接得た 最小限の処理データです ポストプロセッシングや 編集用途に最適です 4つ目はAppleのProRAWです ProRAWはRAWの柔軟性と iPhoneの画像処理を組み合わせます 露出、色、ディテールの編集に より多くの柔軟性を提供します RAW形式について詳しくは WWDC 2021の「Capture and process ProRAW images」をご覧ください 次は 高解像度写真のための キャプチャーセッションの設定方法です まずAVCaptureSessionを 作成します その後セッションを設定します
注意: 24MPと48MPの写真を サポートするのはphotoプリセットのみです 他のプリセットはサポートしていません 次にアプリに適した 優先度を選択します speed撮影は最速で 処理量が最小です balanced撮影は中程度の速度で 良好な品質を提供します quality撮影は時間はかかりますが 最高品質を提供します 詳細については WWDC 2021の「Capture High-Quality Photos Using Video Formats」をご覧ください AVCapturePhotoOutputの 設定中に maxPhotoQualityPrioritizationを 高解像度撮影のデモ用に qualityに設定します これによりセッションが3つすべての 優先度レベルのリソースを準備します speed、balanced、qualityです 一部の高解像度の利用可否は この設定に依存します この点については後ほど 説明します 次にこのセッションでリクエストする 最大サイズを選択します
iOS 16から、デバイスの アクティブフォーマットで サポートされる最大写真サイズを 確認できます supportedMaxPhotoDimensionsは 現在のフォーマットで可能な すべての写真サイズを一覧します ここではデモ用に利用可能な 最大サイズを選択しています ユースケースに合ったサイズを 選んでください
セッション設定をコミットする前に 写真出力の設定を完了してください
コミット後に設定を変更すると 長時間のパイプライン再設定が発生します
撮影準備ができたら maxPhotoDimensionsと photoQualityPrioritizationを 現在の撮影用の AVCapturePhotoSettingsに設定します そして写真撮影用の デリゲートを設定します maxPhotoDimensionsの設定は リクエストであり保証ではありません システムは光量、シーン、 利用可能な処理能力を考慮します 最適なパスを選択します 実際のサイズはAVCaptureResolvedSettings内の デリゲートに返されます 撮影完了時に デリゲートに通知します 各撮影でphotoQualityPrioritizationと maxPhotoDimensionsをカスタマイズできます つまり複数の品質レベルを サポートできます 同じセッション内で 異なるサイズも使えます 撮影間の長い再設定は不要です 高解像度撮影には 特定のリソース割り当てが必要です photoQualityPrioritizationと maxPhotoDimensionsに基づきます システムがリソースを 事前割り当てしていない場合 撮影時に割り当てが発生し 処理が遅くなる可能性があります この遅延を避けるには setPreparedPhotoSettingsArrayを使用します AVCapturePhotoOutput上で 将来の写真撮影の計画を伝えます
例えばアプリに 48メガピクセルモードがある場合 そのモードが有効化された時点で setPreparedPhotoSettingsArrayを呼び出します 撮影前に リソースを準備しておきます 実装方法を説明します できるだけ早い段階で prepareSettingsオブジェクトを作成します
適切なmaxPhotoDimensionsと photoQualityPrioritizationを設定します
setPreparedPhotoSettingsArrayを 呼び出します 後ほど撮影準備ができたら prepareSettingsの設定に合わせた 新しいcaptureSettingsオブジェクトを作成します
prepareSettingsオブジェクトを 再利用することはできません 実際の撮影には使えません
新しいsettingsオブジェクトを作成し 設定が一致することを確認します 撮影が事前割り当てリソースと 一致するようにします 高解像度写真の撮影には 多数のピクセルの処理が必要です
この処理には数秒かかる 場合があります アプリの応答性を確保するための ベストプラクティスを紹介します 処理中もアプリが高速で レスポンシブに保てます 写真リクエスト時は まずキャプチャーステージを経ます その後処理ステージに移ります AVCapturePhotoCaptureDelegate は このプロセス全体で通知を受け取ります 例えばdidCapturePhotoFor resolvedSettings とdidFinishCaptureFor resolvedSettings 処理継続中も アプリを最新状態に保ちます 処理時間は異なります 選択した写真品質の 優先度によって変わります quality優先度の写真は より長い処理時間を利用して 最高品質の画像で提供されます balanced優先度の写真は 最適な品質を提供します 一般的なケースに適した 処理時間で届きます speed優先度の写真は 最速の撮影方法です ただし長い処理で得られる 品質向上はありません
12メガピクセルは3つすべての 優先度レベルで撮影できます
48メガピクセル画像は前述の通り 1フレームのみのため balancedまたはquality優先度で 利用可能です 18メガピクセルと24メガピクセルは マルチフレーム合成画像で 処理に時間がかかるため quality優先度のみで利用可能です この表の18メガピクセルは iPhone 17のセンターフレームフロントカメラ のみで利用可能です センターフレームフロントカメラの詳細は WWDC 2026の「Support Center Stage front camera in your iOS app」をご覧ください AVCaptureResolvedSettingsには photoProcessingTimeRangeプロパティがあります 写真がデリゲートに届くまでの 予想時間を通知します 次の写真は前の写真の処理完了後 のみ撮影できます 2つの撮影間のこの遅延を ショットtoショット遅延と呼びます AVCapturePhotoOutput上の responsive captureを有効にすると 重複撮影が可能になります 前の写真のキャプチャーステージが完了すると 新しい撮影を開始できます 処理の完了を 待つ必要はありません AVCapturePhotoOutput上の captureReadinessプロパティを監視します 次の写真撮影可能な タイミングが分かります 2枚目のショットtoショット遅延を 短縮します 大切な瞬間を 逃さないようになります ただし各写真の処理時間は 以前と同じです 高品質撮影のショットtoショット遅延を さらに短縮するには deferred photo processingを 採用します deferred processingを 有効にすると 撮影直後に軽く処理された プロキシ写真が届きます didFinishCapturingDeferredPhotoProxy 経由で受け取ります デリゲートコールバックです 最終写真の処理は 2つの方法で行われます オンデマンドで写真ライブラリ経由で 最終写真をリクエストする場合 またはバックグラウンドで、システムが 条件が良いと判断した場合 デバイスがアイドル状態など WWDC23の「Create a More Responsive Camera Experience」をご覧ください deferred photo processingの 詳細が分かります deferred photo processingを有効にすると 応答性が大幅に向上します 次の撮影をブロックする 処理時間が削減されます
すべての後続写真の ショットtoショット遅延をさらに短縮します
短時間でより多くの 高品質写真を撮影できます
このアプローチにより処理ステージの 時間が大幅に短縮されます キャプチャーステージは 変わりません Deferred processingにより写真の 処理完了に時間がかかっても 次の撮影をブロックしません その処理はバックグラウンドで 行われるため キャプチャーセッションとの メモリを共有しません これによりマルチフレーム合成撮影が 可能になります 18メガピクセルや 24メガピクセルなどです
応答性をさらに優先するには AVCapturePhotoOutputの fast capture prioritizationを有効にします photoOutputでfast capture prioritizationをオンにすると システムが素早い連続撮影を 検出します
写真品質を 最高品質設定から調整します balanced品質設定に変更します 写真撮影タイムラインで 急速な撮影リクエストがある場合 システムが写真品質優先度を balancedに動的に調整します balanced撮影はキャプチャーと 処理の時間が短いです
連続撮影時に 速度が向上します iOS 27のiPhone 16と iPhone 17から システムはbalanced fast capturesも deferred processingで後処理します 処理時間をさらに最小化します より長い時間で高速な 撮影体験を提供します これを説明するために カメラチームメンバー間の 激しいバスケットボール試合を撮影しています 画面にはバスケットボールコートで アクションが展開されています まずDeferred Processingなし Responsive ShutterとFast capture prioritizationなしで開始します バスケットボールショットの 写真を撮ろうとする際に
写真処理中に撮影ボタンが 回転し続けます 次のショットを 撮ることができません 結果として1枚の写真しか 撮れませんでした APIを使えばもっと良くなります 欲しい瞬間を捉えられます 応答性を管理するAPIを 使います
次のショットではDeferred Processing、 Responsive ShutterとFast captureを有効にします
今度は撮影ボタンが レスポンシブのままです 最高の瞬間を 捉えられます
撮影ボタンを押すと AVCaptureSessionがQuality写真の 撮影を開始します しかし撮影を続けると 高速撮影を検出しBalanced撮影へ インテリジェントに移行します
違いははっきりしています 1枚のブロックされた撮影対 同じ瞬間の5枚のレスポンシブショット はるかにレスポンシブな 撮影体験になりました このビデオではレスポンシブな 写真撮影アプリのベストプラクティスを紹介しました 最高品質と最高解像度の 写真を撮影できます 写真撮影アプリを作る場合は 目的の解像度を特定してください 24MPや48MPなどの 高解像度では トリミング、ズーム、探索のための ディテールが増えます ただしメモリと処理時間が より多く必要です ニーズに合った品質優先度を 選択してください Speed、balanced、qualityはそれぞれ 配信時間と画像忠実度のトレードオフです アプリの要件に合ったレベルを 選んでください 最高品質の撮影が必要な場合は deferred processingと responsive capturesをオンにしてください これらがなければ 各写真が次をブロックします アプリを使う人が二度と戻らない 瞬間を逃すかもしれません カメラアプリをさらに 最適化するには WWDC 2026の「Build a responsive camera app that launches quickly」をご覧ください 必要な時に高速で動作する カメラ体験を構築してください 品質が重要な時は 妥協しないようにしてください ありがとうございました
-
-
5:26 - Configure the AVCaptureSession
import AVFoundation private let session = AVCaptureSession() private func configureSession() { session.beginConfiguration() session.sessionPreset = .photo } -
6:11 - Configure AVCapturePhotoOutput
import AVFoundation private let photoOutput = AVCapturePhotoOutput() private let configurePhotoOutput: () -> Void = { photoOutput.maxPhotoQualityPrioritization = .quality // or .balanced } -
6:38 - Add maxPhotoDimensions to AVCapturePhotoOutput
import AVFoundation let supportedMaxPhotoDimensions = device?.activeFormat.supportedMaxPhotoDimensions ?? [] if let largestDimension = supportedMaxPhotoDimensions.max(by: { lhs, rhs in Int(lhs.width) * Int(lhs.height) < Int(rhs.width) * Int(rhs.height) } ) { photoOutput?.maxPhotoDimensions = largestDimension } session?.commitConfiguration() session?.startRunning() -
7:21 - Update AVCapturePhotoSettings
import AVFoundation let settings = AVCapturePhotoSettings() settings.maxPhotoDimensions = dimension.cmVideoDimensionsValue settings.photoQualityPrioritization = .quality var delegate: AVCapturePhotoCaptureDelegate? // Configure photo request delegate if let delegate { photoOutput?.capturePhoto(with: settings, delegate: delegate) } -
8:59 - Prepare resources for the capture
import AVFoundation let prepareSettings = AVCapturePhotoSettings() prepareSettings.maxPhotoDimensions = photoOutput.maxPhotoDimensions prepareSettings.photoQualityPrioritization = .quality photoOutput.setPreparedPhotoSettingsArray([prepareSettings]) { prepared, error in if let error = error { print("Failed to prepare: \(error)") return } print("Pipeline prepared: \(prepared)") } // Later, when ready to capture — create NEW settings let captureSettings = AVCapturePhotoSettings() captureSettings.maxPhotoDimensions = photoOutput.maxPhotoDimensions captureSettings.photoQualityPrioritization = quality photoOutput.capturePhoto(with: captureSettings, delegate: self)
-
-
- 0:00 - Introduction
The tradeoffs high-resolution photo capture requires — particularly between processing time and image quality — and what the session covers: photo types, configuring and capturing them, and keeping your app responsive.
- 0:52 - High-resolution photos
Explore the different photo resolutions available across iPhone cameras, including 12MP, 24MP, and 48MP, and how the photonic engine balances light and detail.
- 4:07 - Types of captures
Learn about the four types of high resolution captures you can request: fully processed photos, exposure brackets, Bayer RAW, and Apple ProRAW.
- 5:20 - Configure a capture session
An overview of AVCaptureSession setup for high resolution photos. Learn how to select quality prioritization, configure maximum photo dimensions, and preallocate resources.
- 9:41 - Responsive capture best practices
Keep your app fast and responsive by implementing overlapping captures, deferred photo processing, and fast capture prioritization to minimize shot-to-shot delay.