WWDC Quick Look 💓 By SwiftGGTeam
Use HDR for dynamic image experiences in your app

Use HDR for dynamic image experiences in your app

元の動画を見る

ハイライト

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 情報を失う。


関連セッション

コメント

GitHub Issues · utterances