ハイライト
Adaptive HDR は ISO HDR の進化版で、Gain Map 技術により SDR システムとの後方互換性を実現しつつ、単一ファイルに HDR と SDR 表現を同時保存します。
主要内容
HDR(High Dynamic Range)画像技術は近年大きく進歩しました。昨年 Apple は ISO HDR 標準を発表し、今年はその基盤の上に Adaptive HDR(適応型 HDR)技術を導入。
ISO HDR には実用的な問題:HDR 画像を SDR ディスプレイで表示する際 Tone Mapping(トーンマッピング)調整が必要。デフォルトアルゴリズムでの変換は色歪みや露出異常の可能性。また HDR ファイルは SDR デコーダーで直接読めない。
Adaptive HDR は 3 問題すべてを解決:SDR システム、デコーダー、アプリとの後方互換性;単一ファイルに HDR と最適化された SDR 表現を同時保存;適応型 Tone Mapping 能力。
iPhone は 2020 年から Gain Map 埋め込み画像をキャプチャして表示品質を向上 — 現在 1 兆枚超。この年 Apple は Gain Map 技術の Adaptive HDR 標準化を推進、現在 ISO 委員会草案段階、国際標準草案に向けて前進中。
Adaptive HDR の核心思想:ファイルに完全後方互換の SDR ベースライン表現と特定メタデータ、Gain Map(ゲインマップ)を保存。Gain Map はシーンの明るい領域の空間位置を記録。ベースライン画像に適用すると HDR 出力を生成。
詳細
Adaptive HDR ファイル形式の新規性は HDR 画像を直接含まず、「材料」と「レシピ」のセットで HDR 効果を共同作成すること。HEIC ファイルは依然 1 画像のみ含むが、開発者は画像の代替外観をリクエスト可能。デフォルトでは SDR 表現にデコード。リクエスト時に HDR 外観の代替表現を取得。
(23:24)
// HDR 画像を読み込む - expandToHDR オプションを使用
let hdrImage = CIImage(url: imageURL, options: [.expandToHDR: true])
// 画像のコンテンツ Headroom を問い合わせる
let headroom = hdrImage.contentHeadroom
// iPhone HDR 写真では、値は 1 を超え最大 8 になる
// 一部の画像では、Headroom が不明であることを示すため属性が 0 を返す場合がある
expandToHDRオプション:Core Image にデフォルト SDR ではなく HDR 形式で画像をロード指示contentHeadroomプロパティ:画像の Content Headroom 値を返す — SDR は 1、HDR は 1 超、未知時は 0
(26:07)
// SDR と Gain の編集戦略例
// 1. SDR 画像を読み込む
let sdrImage = CIImage(url: imageURL)
// 2. Gain Map を読み込む
let gainImage = CIImage(url: imageURL, options: [.auxiliaryHDRGainMap: true])
// 3. Gain 画像を SDR 画像と同じサイズにスケーリング
let scaledGainImage = gainImage.transformed(by: CGAffineTransform(scaleX: 2, y: 2))
// 4. 両方の画像に同じフィルタ(クロップ、歪みなど)を適用
let editedSdrImage = stretchCropFilter.apply(to: sdrImage)
let editedGainImage = stretchCropFilter.apply(to: scaledGainImage)
auxiliaryHDRGainMapオプション:ファイル内 Gain Map を独立 CIImage としてロード- スケーリング:Gain 画像は通常 SDR 画像の半分サイズ、編集時に差異を考慮
- 同期編集:SDR 画像に編集適用時、Gain 画像にも同じ編集を適用
(29:15)
// Core Image と Metal を使って HDR 画像を表示
// 1. 拡張レンジコンテンツ用に MTKView を設定
metalView.colorspace = CGColorSpace(name: CGColorSpace.extendedLinearSRGB)
metalView.pixelFormat = .rgba16Float
metalView.framebufferOnly = false
// 2. CIFilters を適用して編集後の CIImage を作成
let editedImage = applyFilters(to: hdrImage)
// 3. ビューの現在の表示 Headroom を取得
let displayHeadroom = metalView.currentDisplayHeadroom
// 4. 新しい CIToneMapHeadroom フィルタを適用
let toneMappedImage = editedImage.applyingFilter(
"CIToneMapHeadroom",
parameters: ["inputHeadroom": displayHeadroom]
)
// 5. CIRenderDestination API で結果をレンダリング
let destination = CIRenderDestination(metalView)
try? context.startRendering(to: destination, from: toneMappedImage)
- 拡張カラースペース:MTKView を拡張線形 sRGB カラースペースと 16 ビット浮動小数点ピクセル形式に設定
currentDisplayHeadroom:現在ディスプレイの利用可能 Headroom を取得CIToneMapHeadroomフィルター:Display Headroom に基づき HDR 画像を自動調整 — ISO HDR ファイルは新 Reference White Tone Mapping Operator、Adaptive HDR ファイルは最適化カスタム Tone Map 関数
(30:09)
// SDR と Gain Map の組み合わせを使って表示
let displayHeadroom = metalView.currentDisplayHeadroom
// imageByApplyingGainMap API を使って 2 つの画像を合成
let combinedImage = sdrImage.imageByApplyingGainMap(
gainMap: editedGainImage,
headroom: displayHeadroom
)
// 結果をレンダリング
let destination = CIRenderDestination(metalView)
try? context.startRendering(to: destination, from: combinedImage)
imageByApplyingGainMap:SDR 画像と Gain Map を組み合わせ、指定 Headroom で Tone Mapping 後画像を生成- 単一ステップ操作:この API が組み合わせと Tone Mapping を 1 操作で完了
システムは 3 つの Tone Mapping 方法を提供。ISO HDR 画像は ITU デフォルトグローバル Tone Mapping。今年 Apple は新 Reference White Tone Mapping Operator を開発、出力品質をより良く保持、ハイライトクリッピング削減、色再現性維持。Adaptive HDR 画像はファイル内 Gain Map に最適化されたカーブで調整。
重要ポイント
-
Tone Mapping はシステム API を使用:自前 Tone Mapping アルゴリズムを実装しない。Apple の
CIToneMapHeadroomフィルターは画面輝度設定、バッテリー制限、フォアグラウンド/バックグラウンド切り替えなど各種 Display Headroom 変化シナリオを既に考慮。 -
適切な編集戦略を選択:アプリ要件に応じ 3 編集戦略から 1 つ選択。HDR 戦略が最も単純、元 Gain Map 変更不要のシーン向け。SDR と Gain 戦略は元 Gain Map を保持、回転・歪み・クロップなど単純編集向け。SDR と HDR 戦略が最も複雑だが SDR と HDR を個別最適化可能。
-
異なる Display Headroom 条件でテスト:各種画面輝度設定、バッテリー状態で HDR レンダリング効果をテスト。特にフォアグラウンド/バックグラウンド切り替え時の HDR 状態 — アプリがバックグラウンドに入るとシステムは画像を SDR に Tone Map、復帰時に完全 HDR データ再ロードが必要。
-
Adaptive HDR 形式を優先:新プロジェクトは ISO HDR ではなく Adaptive HDR を使用。後方互換性で SDR デバイスでも正常表示、HDR デバイスでは完全ダイナミックレンジ表示。
-
完全なカラースペースパイプラインを維持:ファイル読み込みから編集、書き戻しまで全パイプラインを HDR カラースペースで保持。いかなるステップでのダウングレードも不可逆、HDR 情報を失う。
関連セッション
- Display EDR content with Core Image, Metal, and SwiftUI — Core Image ベースマルチプラットフォーム SwiftUI アプリから EDR レンダリングサポートを追加
- Build compelling spatial photo and video experiences — spatial 写真と動画の採用、visionOS の新 Quick Look プレビューアプリケーション API を含む
- Keep colors consistent across captures — Constant Color API とアプリでの精密色判定支援
- Discover media performance metrics in AVFoundation — 新メディア性能 API でユーザー体験を監視・分析・改善
- What’s new in DockKit — DockKit のインテリジェントトラッキングによる被写体間スムーズ遷移
コメント
GitHub Issues · utterances