ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
ProRAW画像の撮影と処理
AppでProRAWをサポートすると、標準のRAW情報をAppleの高度なコンピュテーショナルフォトグラフィ技術と組み合わせることで、フォトグラファーが画像を簡単に取り込んで編集できるようになります。まず、ProRAW画像のルック&フィール、クオリティメトリクス、Appとの互換性などといったフォーマットの概要を説明します。さらに、AVFoundationを使った画像の取り込み、PhotoKitを使ったストレージ、Core Imageを使った編集など、制作パイプラインのあらゆる段階でProRAWをAppに取り入れる方法を紹介します。
リソース
- Capture setup
- Capturing Photos in RAW and Apple ProRAW Formats
- Capturing Still and Live Photos
- Core Image
- PhotoKit
- Photos
関連ビデオ
WWDC21
WWDC20
-
ダウンロード
♪ (ProRAW画像の撮影と処理) こんにちは私はDavid Haywardです 私は Core Imageチームのエンジニアです 今日は同僚のTuomas Viitanen Matt Dickoff そして私が 詳しくプレゼンテーションをします このページではProRAW画像 フォーマットについての知識と AppにProRAWを 追加する方法をご紹介します 今日はこんな感じでお話ししましょう まず ProRAWファイルの構成について説明します 次に これらのファイルを取り込む方法 フォトライブラリに保存する方法 そして編集して表示する方法について説明します まず「ProRAWとは何か?」から説明します 以前からアップル社のデバイスでは 当社の画像信号処理装置をフルに活用して すぐに表示できる美しいHEICやJPEG画像を 取り込むことができました そして iOS 10からは ベイヤーパターンのRAWセンサーデータを撮影し DNGファイルに保存することに対応しました この2つのアプローチの違いと優位性は WWDC2016の「Advances in iOS photography」 というセッションで詳しく説明されていました そのプレゼンテーションでは2つのフォーマットを 素晴らしい例えを使って説明していました HEICやJPEGを加工したものはパン屋に行って 多層構造のケーキを注文するようなものです 一方 BayerパターンのRAWファイルは 食品店に行って ケーキを作るための原材料を 手に入れるようなものです HEICやJPEGを加工するメリットは 最終的にAppleが焼き付けた画像が得られることです Smart HDR Deep Fusionナイトモードなどで 多様なキャプチャフレームを 融合させて作っているので 表示が速く画質も素晴らしいです また 高度な非可逆圧縮を採用しているため ファイルサイズも小さくなっています Bayer RAWの利点は編集の自由度が 格段に高い画像が得られることです 非可逆圧縮で保存されていないので より多くのビットの精度を持っています ProRAWが目指したのは 両者の良いところを合わせた画像 フォーマットを確立することでした ProRAWのいいところは HEICと同じような見た目でありながら ロスレス圧縮を採用していることです また シーンによっては 多重露光したものを合成しているので ダイナミックレンジが大きく編集に適しています 低ノイズでデモザイク処理が施されているため 表示速度が速いのが特徴です ProRAWフォーマットは互換性 品質 見た目の3つの特性を 最大限に生かすように設計されています それぞれについてもう少し詳しく説明しましょう 互換性を確保するために ProRAWファイルは標準的なAdobe DNGファイルに含まれています リニアライズされたDNGファイル形式は PhotosなどのApple appや LightroomなどのAdobe appなどで サポートされています 多くのAppはシステムフレームワーク ImageIO Core Imageによって 自動的にサポートされています 以前のバージョンのiOSやmacOSも このフォーマットに基本的に対応しています また ファイルにはフル解像度のJPEG品質の プリレンダリングプレビューが 含まれているのも特筆すべき点です カメラAppで撮影したすべてのProRAWには このプレビューが表示され ProRAWモードを有効にしないで 撮影した場合の画像と同じになります ProRAWファイルのクオリティはかなりのものです DNGのピクセルはシーンに応じてリニアライズされ 複数のデモザイク処理された露出 と画像フュージョンを 組み合わせて生成されることもあり ロスレスに圧縮された12ビットRGBですが 適応的な圧縮と伸張によって これらのビットを生成することで 最大14ストップのダイナミック レンジを実現しています その結果 ファイルサイズは 10メガバイト(MB)から40MBに なりますがこのサイズはそれぞれの写真の 特有なシーンに応じて変化します Appleは 画像の質を高めるために 多大な努力をしています ProRAW画像は当社のHEICやJPEGと同じように デフォルトのルックを持っています これはDNGファイルに特殊なタグ を埋め込むことで実現しています これらのタグはDNGのスペックに記載されており 各画像のデフォルトのルックを どのようにレンダリングするか のレシピとなっています 最初に適用されるタグはLinearizationTableで 12ビットの保存データを リニアのシーン値に分解します ProRAW画像はシーンの ダイナミックレンジに適応するため BaselineExposureタグを使用しています BaselineSharpnessタグではデフォルトで適用する エッジシャープネスの量を指定することができます ProfileGainTableMapタグは DNG 1.6仕様で新たに追加された タグで 明るい部分と影の部分を どのように調整するかを記述することができます 最後はProfileToneCurveです これは出力されるグローバルな トーンカーブを指定します これらのタグはすべて それぞれの画像に固有のものです ケーキではなくレシピを提供しているので 画像の編集性も高いです 例えば デフォルトのシャープネスや トーンカーブなどは いつでも 変更することができます 最後に背景の中に存在する場合 人物 肌 空などの領域の セマンティックマスクをProRAWに保存します さて ProRAWの構成要素がわかったところで ここからはTuomasが ProRAWの使い方を説明します ありがとうDavid 私はTuomas Viitanenです Camera Softwareチームのエンジニアですが お手持ちのAppでApple ProRAWを キャプチャする方法をご案内します AVFoundation Capture APIは iOSやMacOSのカメラへのアクセスを提供します ライブプレビューや動画の配信 写真の撮影動画の記録など 他にも様々なことができます また 最近の追加機能として新しい Apple ProRAW DNGフォーマットでの 写真撮影に対応しました AVFoundation Capture APIの 基本的な使い方に関する情報源としては AVCaptureの写真出力の使い方を説明した WWDC 2016の「Advances in iOS Photography talk 」や 簡単なカメラキャプチャ Appの例である AVCamサンプルコードなどがあります 次に Apple ProRAWのキャプチャ を詳しく見てみましょう その前にApple ProRAWが どこでサポートされているかを簡単にご紹介します そのためには既存のBayer RAWサポートとの 比較を行うことが良いスタートとなります Bayer RAWはiOS 10で導入され 幅広いデバイスでサポートされています Apple ProRAWはiOS 14.3で導入され iPhone 12 ProとiPhone 12 Pro Max でサポートされています Apple独自のCamera Appは Deep FusionやNightモードなどの すべてのフュージョンキャプチャ およびフラッシュキャプチャで Apple ProRAWキャプチャをサポートしています Apple ProRAWでは写真品質の優先順位を 「バランス」と「品質」に設定することができ RAWキャプチャに Appleのイメージフュージョンの 効果を得ることができます Bayer RAWはワイドやテレなどの シングルカメラのAVCaptureDevicesにしか 対応していません Apple ProRAWはズーム時にカメラが シームレスに切り替わるデュアル ワイドカメラ デュアルカメラ トリプルカメラのデバイスを含む すべてのデバイスに対応しています Bayer RAWと同様 Apple ProRAWは深度データの配信や コンテンツアウェアの歪み補正 には対応していません ライブフォトキャプチャは Bayer RAWでのみサポートされます ポートレートエフェクトマットや セマンティックセグメンテーション のスキンとスカイマットはProRAW でのみサポートされています ではApple ProRAWをキャプチャ する方法をご紹介しましょう 取り上げる項目は キャプチャデバイスと キャプチャセッションの設定方法 写真出力の設定方法 ProRAWキャプチャ用の 写真設定の準備の仕方 ProRAW写真をキャプチャした後の オプションについてです まずは セッションの設定から始めましょう Apple ProRAWは最高品質の写真をサポートする フォーマットにのみ対応しています キャプチャのSessionPresetを .photoに設定することが必要です また デバイスのフォーマットを 手動で選択したい場合は 高画質な静止画に対応した フォーマットが用意されています なお 高画質の静止画とは異なりますが より多くのフォーマットに対応しています そして希望するフォーマットを デバイスのactiveFormatに設定するだけです この例以降ではサポート されている項目のリストから 最初のインデックスを単純に使用していますが Appに最適な基準で選ばれたものに これを置き換えることができます では ProRAWキャプチャでの写真出力の 設定方法を見てみましょう まずphotoOutputでProRAWを 有効にする必要があります そうしないとパイプラインの再構成 に時間がかかってしまうので セッションを開始する前に 必ずそれを実行してください このプロパティをtrueに設定する とProRAWキャプチャ用の キャプチャパイプラインが準備され サポートされている RAWフォトピクセルフォーマットタイプのリストに ProRAWピクセルフォーマットが追加されます またキャプチャパイプラインに キャプチャの速度と品質のどちらを重視するか あるいは両者のバランスをとるか を指示することもできます 撮影した写真に対する画質優先の効果については ビデオフォーマットを利用して 「Capture high-quality photos」 を参照してください そして次にキャプチャの 準備の仕方を見ていきましょう ProRAWキャプチャーの写真設定を行うためには 正しいRAWピクセルフォーマットを 選択する必要があります サポートされているRAWピクセルフォーマットは サポートされているBayer RAWフォーマットと同様に availableRawPhoto PixelFormat Typesから得ることができます ProRAWフォーマットと BayerRAWフォーマットの区別は photoOutputの新しい isAppleProRAWPixelFormatクラスメソッドを使って 行うことができます ProRAWのピクセルフォーマットの例としては 16ビットのフルレンジRGBAピクセル フォーマットであるl64rがあります 参考までにあるフォーマットが Bayer RAWフォーマットであるかどうかは isBayerRAWPixielFormatクラスの メソッドで問い合わせできます 次に Apple ProRAWと オプションで完全にレンダリング されたプロセス写真を 一緒に撮影するためのオプションについて説明します ProRAWを撮影するための第1の そして最もシンプルなオプションは ProRAW写真のみをリクエストすることです そのためにはphotoSettingsの作成時に rawPixelFormatTypeを指定すればよいのです これにより 後ほどマットさんが 紹介するように 作業や フォトライブラリへの保存が簡単な 単一のアセットを得られます またphotoSettingsに processedFormatを指定することで Bayer RAWと同じように加工した写真と ProRAWのペアで 撮影することも可能です しかしこれでは複数のアセット を扱う必要がありますし フォトライブラリでの 管理も大変です 幸いなことにApple ProRAWは フル解像度のJPEG画像までを サムネイルとしてサポートしており 多くの場合これによって 前の2つのオプションの 最善のものを得ることができます サムネイルをリクエストするには 必要なフォーマットを availableRawEmbeddedThumbnail PhotoCodecTypesから選択し 必要な サムネイルのサイズを指定します これでProRAWの写真を撮影する 準備がほぼ整いました その前に必要であれば このキャプチャーに写真品質の優先順位を 指定することができます ここで指定する値はphotoOutputで以前に指定した maxPhotoQualityPrioritization 以下でなければならない ことに注意してください また 撮影後すぐにお客様にお見せしたい場合は ディスプレイサイズのプレビュー画像以下で リクエストすることができます そして ProRAW写真のキャプチャは 他の静止画キャプチャと同じ 「capturePhoto」メソッドを使用して行います さて 静止画の撮影が終わったところで リクエストされた写真ができあがったときのことを 考えてみましょう 写真が完全に処理されると didFinishProcessingPhoto デリゲートは ProRAW写真を表す AVCapturePhotoとともに呼び出されます キャプチャのプレビューイメージ をリクエストした場合は ディスプレイに表示するために 圧縮されていないプレビュー画像の ピクセルバッファやそのCGImage 表現を得られるようになりました また ProRAWと一緒に処理済みの写真を リクエストした場合 didFinishProcessingPhoto デリゲートが2回起動されます 受信したAVCapturePhotoの isRawPhotoプロパティを使って ProRAWと処理済みの写真を区別することができます そしてProRAWのfileDataRepresentationを要求 するだけでフォトライブラリに DNGを保存することができます また任意でRAWのピクセルデータを使って 作業をしたい場合はピクセル バッファを用意してください 先ほどDavidが言ったようにProRAW DNGには セマンティックセグメンテーション マットが含まれる場合があります これらのマットを入れるかどうかは 自動的にで シーンによって異なります マットは現在AVFoundationのCapture APIでは 利用できませんが 後でDavidが紹介するように CoreImageやImageIOのAPIで 取得することができます そして最後にProRAW DNGの カスタマイズ方法をご紹介します AVCapturePhotoFileData RepresentationCustomizerの デリゲートメソッドを実装することで ProRAWを カスタマイズすることができます replacementAppleProRAW CompressionSettingsを 実装することで ProRAW写真の圧縮ビット数や画質を 変更することができます Apple ProRAWはデフォルトでは12ビットで コンパンディングカーブを使って ロスレスにエンコードされています ロスレスに圧縮されたProRAW のビット深度を変更するには 品質レベルを1のまま カスタマイザーで希望のビット深度を指定します これにより ストレージスペースを節約しつつ ProRAW写真の高品質を維持することができます 非可逆圧縮を希望する場合は 品質レベルを1以下に設定すると ProRAWは自動的に8ビットの 非可逆で圧縮されます これにより ファイルサイズは小さくなりますが ProRAW写真の品質には 明らかな影響があります これでカスタマイザーを実装したことになるので didFinishProcessingPhoto デリゲートでキャプチャした ProRAW DNGのカスタマイズを リクエストすることができます カスタマイザーを作成しそれを fileDataRepresentationに提供することで 先ほど提供した圧縮設定で カスタマイズされたProRAWが戻ってきます 以上AVFoundation Capture APIを使った Apple ProRAWのキャプチャの紹介でした Apple ProRAWとフォトライブラリーについては マットさんにお任せします マット? ありがとう Tuomas!こんにちは! 私はマット・ディックオフです Photosチームのエンジニアです 今回はまず 撮影したProRAWファイルを 完全なアセットとして フォトライブラリに保存する方法をご紹介します 続いて フォトライブラリにすでに存在する RAWを取得する方法を説明します PhotoKitはAppleプラットフォーム のフォトライブラリを 操作するためのフレームワークです これらのリリースで初めて導入され その後 改良や追加が行われました 特筆すべきはApple ProRAWなどの RAW画像フォーマットに対応していることです 今日は フォトライブラリのRAWを扱う 特定のAPIのみを取り上げます このプレゼンテーションの後PhotoKitについて まだ質問がある場合はオンラインの 開発者向けドキュメントを ご覧になることをお勧めします 新しいアセットを保存するためには 共有されているPHPhotoLibraryに 変更を加える必要があります 他のアセットを保存する場合と同様に 今回の変更はPHAssetCreationRequestであり Apple ProRAWファイルをプライマリの .photo PHAssetResourceとしてこの アセットに追加することになります では そのためのコードが どのようなものか見てみましょう まず 共有フォトライブラリの 変更を実行するところから始めます ここでは単純にPHAssetCreationRequestを作成し そこにApple ProRAWファイルを プライマリフォトリソースとして追加します そしてこれで終わりです 成功とエラーを Appが適切に処理すればいいのです フォトライブラリにアセットを 追加する方法がわかったところで ユーザーがすでにライブラリに 持っているかもしれないRAWアセットを含めて アセットを取得する方法を見てみましょう 嬉しいことにiOS 15では新しい PHAssetCollectionSubtype .smartAlbumRAWが提供されています このスマートアルバムを使えば フォトライブラリにある RAWリソースを持つあらゆる アセットを含むコレクションを 簡単に手に入れることができます このアルバムは Appleの写真 Appで見ることができる RAWアルバムと同じです さてRAWリソースを持つPHAssetsができたところで 実際にリソースを取得するために 必要なことを見てみましょう まず PHAssetのすべてのPHAssetResourcesを 取得したいと思います 次に 2種類のリソースを求めています 前回お話しした.photoと さらに.alternatePhotoです ここで .alternatePhotoとは何かについて 簡単に説明したいと思います フォトライブラリの中には 一部のデジタル一眼レフカメラで 採用されている古いRAW+JPEGストレージモデルに 準拠したアセットが含まれています そのためにはRAWとJPEGを 2つの異なるリソースとして保存する必要があり JPEGを写真 RAWを代替写真として保存します そのため フォトライブラリの ファイルサイズが大きくなり 携帯性が損なわれ ユーザーの使い勝手が悪くなることがあります このモデルはApple ProRAWには推奨されていません ProRAWファイルをフォト ライブラリーに保存する場合は キャプチャー設定でフルサイズのJPEGプレビューを ファイルに埋め込むようにしてください さて 話はリソースに戻ります リソースのuniformTypeIdentifierをチェックして 興味のあるRAWタイプに 適合しているかどうかを確認します そして最後にRAWリソースを手に入れたら PHAssetResourceManagerを使って 実際のデータを取得します それでは コードで見てみましょう まず アセットにあるすべてのPHAsetResources を 繰り返し検索し .photoまたは.alternatePhotoタイプのものを探し それらがRAW画像UTTypeに準拠 しているかどうかをチェックし 最後にPHAssetResourceManagerを使って そのリソースのデータをリクエストします そして これで終わりです フォトライブラリからRAWリソース を使ったアセットを PhotoKitを使って保存・取得する 方法をご紹介しました さてここからはDavidに 話を戻し AppleProRAWの画像を どのように編集し 表示するのがベストかを話します ありがとうMatt 今日の講演の最後のセクションは Core Imageフレームワークを使って ProRAW画像を編集・表示する方法です ProRAWファイルからCII画像を作成する方法 最も一般的なユーザー調整の適用方法 デフォルトのルックをオフにして リニアでシーンに適した値を得る方法 HEICなど出力に適したフォーマット に編集内容をレンダリングする方法 そして最後にExtended Dynamic Rangeディスプレイを備えた MacにProRAWを表示する方法を説明します ProRAWからプレビューイメージを取得するには CGImageSourceCreateWithURLおよび CGImageSourceCreate ThumbnailAtIndex APIを使用します iOS 15とmacOS 12で新たに導入された Core Imageには プレビューにアクセスするための 便利なAPIが追加されています CIImageの初期化時に 希望のオプションキーを渡すことで 人物 肌 空などの セマンティックセグメンテーション マットの取得が可能です こちらも オプションのマット画像に アクセスするための APIが新しくなりより便利になりました 最も重要なのは Appがプライマリの ProRAW画像を取得することです Appがデフォルトの レンダリングルックを表示したいだけなら URLやデータから不変のCIImageを 作成するだけでよいのです しかしあなたのAppが ProRAWの編集機能を フルに発揮させたい場合は URLからCIFフィルターを作成します このフィルターにoutputImageを求めると デフォルトのようなCIImage が得られます このAPIの主な利点は フィルターを簡単に変更できることです RAW CIFilterはいくつかの入力があって Appが新しいoutputImage を生成するために変更できるのです 基本的なコードパターンは 文書化されたキー文字列の1つに 値のオブジェクトを設定することです このsetValue forKey APIは アップデートが必要でした iOS 15とmacOS 12では新しく より発見しやすく Swiftに適したAPIを作成しました 新しいAPIを使用するには CIRAWFilterインスタンスを作成し 必要なプロパティに新しい値を設定するだけです 次に どのようなプロパティを 変更したいかについて説明します ProRAW画像のダイナミックレンジを考えると 最もコントロールが重要な1つに露光量があります この値は 任意のフロートに設定できます 例えばプラス1に設定すると 2倍の明るさに またマイナス1に設定すると半分の明るさになります ProRAWはscene-referredな 線形空間で編集されるため 画像のホワイトバランスを 調整すると より効果的です シーンニュートラルはケルビン温度として またはx/y色度座標として指定できます ProRAWルックのデフォルトのシャープネスは 0~1の任意の値に調整できます また ProRAWのローカルトーンマップの強さは 0~1の任意の値に調整できます ローカルトーンマップでは画像の各領域に 最適なトーンカーブを持たせることができます ここではローカルトーンマップの強さを 完全にオフにしたProRAW画像と 半分の強さ… 完全にオンにした場合の例を示します この画像では ローカルトーンカーブが暗い部分を持ち上げ 明るい部分を下げることで スタンダードダイナミックレンジのディスプレイに 最適な結果をもたらしています 次に 14ストップの リニアシーンリファレンスデータに Appが 直接アクセスする方法について説明します ほとんどのユーザーは 先に説明した一般的な調整方法を 好むでしょうが 特定のAppケースでは リニアデータへのアクセスが非常に便利です リニア画像を得るためには 画像にデフォルトのルックを適用する フィルター入力をオフにすればよいのです outputImageを取得する前にbaselineExposure exposureBias boost localToneMapAmountを 0に設定し ガモットマッピングを無効にします linearRAWImageを取得すると 他のCore Imageフィルターの入力として使用でき シーンに応じた計算を行うことができます 例えば Core Imageに内蔵されている ヒストグラムフィルターを使って 統計量を算出することができます また リニア画像をレンダリングして ピクセルデータを取得したいなどです これを実現するには RGBA-half-float mutable data用の CIRenderDestinationを作成し レンダーデスティネーションに 任意のリニアcolorSpaceを使用するように指示し CIContextにrawFilterの出力画像を レンダリングするタスクを開始させます ここでは デフォルトのルックを持つProRAWと 撮ったままのリニアscene-referred 画像を比較した例を示します リニア画像は フラットで露出アンダーに見えますが シーンからの14ストップのデータ がクリップされずに 全て含まれています また このペアの画像は output referred画像とscene-referred画像の 違いをよく表しています output-referredデフォルトのルックで 画像の中で最大のlumaを持つ領域は 左の夕日の中にあります しかしこの右の空の部分は 夕日の80%の明るさのlumaを持っています デフォルトの画像は見栄えがしますが luma 値はシーンの現実を表していません リニアscene-referred画像の場合 画像右側の空の 最大輝度は 夕日の輝度のわずか12%であり より物理的に理にかなっています そのため画像処理や解析では リニアscene-referred画像がかなり重要になります AppがProRAW CIFilter の プロパティに変更を加えた後で 画像を HEIC や JPEG などの 出力に適したフォーマットに 保存したいかもしれません ここでは RawFilterの出力画像を 8ビット深度のHEICファイルに 保存する例をご紹介します このAPIで使用する出力colorSpace を指定することができますが 当社ではdisplayP3を推奨しています また オプションの辞書を使って セマンティックマスクをHEICに 保存することも可能です また ProRAWは精度が高いので この新しいCore Image APIを使って 10ビットディープHEICファイルに 保存することも検討してみてください これまで説明してきたすべての調整は 標準ダイナミックレンジにトーンマップ およびガモットマップされた出力画像を生成します これは一般的に「SDR」と略されます 次にご紹介するのは ProRAW画像のダイナミックレンジを Extended Dynamic Rangeディスプレーで 存分に表現する方法です MacBook Pro iMac Pro Display XDRなど 多くのMac用ディスプレイでは MetalKit Viewを使って EDRコンテンツを表示することができます ProRAW CIImageを表示するには 最高のパフォーマンスを得るために MetalKitのViewサブクラスを 使用することをお勧めします MetalKit View のサブクラスは ビュー用にCIContextと MTLCommandQueue を作成する必要があります MetalKit ViewでCore Imageを使用して 最高のパフォーマンスを得るため の重要な詳細については このテーマに関する昨年の プレゼンテーションをご覧ください MacのディスプレイがEDRをサポートしている場合は ビューのcolorPixelFormatをrgba16Floatに設定し wantsExtendedDynamic RangeContentをtrueに設定します そして ビューのサブクラスを描画するときには rawFilter.extended DynamicRangeAmountを1 に設定し Core Image コンテキストにoutputImage を レンダリングするタスクを 開始するように指示します ProRAWの画像をEDRディスプレイで見るのは 実際に見てみないと わからないものです しかし それがどのようなもの であるかを概説してみましょう ここではSDRのイメージを示していますが これは同じProRAWファイルを EDRで表示したときのイメージです 明るい部分やスペキュラハイライトは トーンマッピングによる制限がなくなったので 華やかに見えるようになりました 以上で Apple ProRAWについての説明を終わります 今日は ファイルフォーマットの設計と内容 そしてこれらの画像をどのように 撮影 保存 編集するかについて詳しく説明しました あなたのAppが これらの画像の可能性を どのように引き出してくれるのか楽しみです ♪
-
-
7:52 - Setting up device and session
// Use the .photo preset private let session = AVCaptureSession() private func configureSession() { session.beginConfiguration() session.sessionPreset = .photo //... }
-
8:03 - Setting up device and session
// Or optionally find a format that supports highest quality photos guard let format = device.formats.first(where: { $0.isHighestPhotoQualitySupported }) else { // handle failure to find a format that supports highest quality stills } do { try device.lockForConfiguration() { // ... } device.unlockForConfiguration() } catch { // handle the exception }
-
8:39 - Setting up photo output 1
// Enable ProRAW on the photo output private let photoOutput = AVCapturePhotoOutput() private func configurePhotoOutput() { photoOutput.isHighResolutionCaptureEnabled = true photoOutput.isAppleProRAWEnabled = photoOutput.isAppleProRAWSupported //... }
-
8:59 - Setting up photo output 2
// Select the desired photo quality prioritization private let photoOutput = AVCapturePhotoOutput() private func configurePhotoOutput() { photoOutput.isHighResolutionCaptureEnabled = true photoOutput.isAppleProRAWEnabled = photoOutput.isAppleProRAWSupported photoOutput.maxPhotoQualityPrioritization = .quality // or .speed .balanced //... }
-
9:26 - Prepare for ProRAW capture 1
// Find a supported ProRAW pixel format guard let proRawPixelFormat = photoOutput.availableRawPhotoPixelFormatTypes.first( where: { AVCapturePhotoOutput.isAppleProRAWPixelFormat($0) }) else { // Apple ProRAW is not supported with this device / format } // For Bayer RAW pixel format use AVCapturePhotoOutput.isBayerRAWPixelFormat()
-
10:09 - Prepare for ProRAW capture 2
// Create photo settings for ProRAW only capture let photoSettings = AVCapturePhotoSettings(rawPixelFormatType: proRawPixelFormat) // Create photo settings for processed photo + ProRAW capture guard let processedPhotoCodecType = photoOutput.availablePhotoCodecTypes.first else { // handle failure to find a processed photo codec type } let photoSettings = AVCapturePhotoSettings(rawPixelFormatType: proRawPixelFormat, processedFormat: [AVVideoCodecKey: processedPhotoCodecType])
-
10:53 - Prepare for ProRAW capture 3
// Select a supported thumbnail codec type and thumbnail dimensions guard let thumbnailPhotoCodecType = photoSettings.availableRawEmbeddedThumbnailPhotoCodecTypes.first else { // handle failure to find an available thumbnail photo codec type } let dimensions = device.activeFormat.highResolutionStillImageDimensions photoSettings.rawEmbeddedThumbnailPhotoFormat = [ AVVideoCodecKey: thumbnailPhotoCodecType, AVVideoWidthKey: dimensions.width, AVVideoHeightKey: dimensions.height]
-
11:08 - Prepare for ProRAW capture 4
// Select the desired quality prioritization for the capture photoSettings.photoQualityPrioritization = .quality // or .speed .balanced // Optionally, request a preview image if let previewPixelFormat = photoSettings.availablePreviewPhotoPixelFormatTypes.first { photoSettings.previewPhotoFormat = [kCVPixelBufferPixelFormatTypeKey as String: previewPixelFormat] } // Capture! photoOutput.capturePhoto(with: photoSettings, delegate: delegate)
-
11:44 - Consuming captured ProRAW 1
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) { guard error == nil else { // handle failure from the photo capture } if let preview = photo.previewPixelBuffer { // photo.previewCGImageRepresentation() // display the preview } if photo.isRawPhoto { guard let proRAWFileDataRepresentation = photo.fileDataRepresentation() else { // handle failure to get ProRAW DNG file data representation } guard let proRAWPixelBuffer = photo.pixelBuffer else { // handle failure to get ProRAW pixel data } // use the file or pixel data }
-
12:52 - Consuming captured ProRAW 2
// Provide settings for lossless compression with less bits class AppleProRAWCustomizer: NSObject, AVCapturePhotoFileDataRepresentationCustomizer { func replacementAppleProRAWCompressionSettings(for photo: AVCapturePhoto, defaultSettings: [String : Any], maximumBitDepth: Int) -> [String : Any] { return [AVVideoAppleProRAWBitDepthKey: min(10, maximumBitDepth), AVVideoQualityKey: 1.00] } }
-
13:35 - Consuming captured ProRAW 3
// Provide settings for lossy compression class AppleProRAWCustomizer: NSObject, AVCapturePhotoFileDataRepresentationCustomizer { func replacementAppleProRAWCompressionSettings( for photo: AVCapturePhoto, defaultSettings: [String : Any], maximumBitDepth: Int) -> [String : Any] { return [AVVideoAppleProRAWBitDepthKey: min(8, maximumBitDepth), AVVideoQualityKey: 0.90] } }
-
13:51 - Consuming captured ProRAW 4
// Customizing the compression settings for the captured ProRAW photo func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) { guard error == nil else { // handle failure from the photo capture } if photo.isRawPhoto { let customizer = AppleProRAWCustomizer() guard let customizedFileData = photo.fileDataRepresentation(with: customizer) else { // handle failure to get customized ProRAW DNG file data representation } // use the file data }
-
15:19 - Saving a ProRAW asset with PhotoKit
PHPhotoLibrary.shared().performChanges { let creationRequest = PHAssetCreationRequest.forAsset() creationRequest.addResource(with:.photo, fileURL:proRawFileURL, options:nil) } completionHandler: { success, error in // handle the success and possible error }
-
15:45 - Fetching RAW assets from the photo library
// New enum PHAssetCollectionSubtype.smartAlbumRAW PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .smartAlbumRAW, options: nil)
-
17:16 - Retrieving RAW resources from a PHAsset
let resources = PHAssetResource.assetResources(for: asset) for resource in resources { if (resource.type == .photo || resource.type == .alternatePhoto) { if let resourceUTType = UTType(resource.uniformTypeIdentifier) { if resourceUTType.conforms(to: UTType.rawImage) { let resourceManager = PHAssetResourceManager.default() resourceManager.requestData(for: resource, options: nil) { data in // use the data } completionHandler: { error in // handle any error } } } } }
-
18:28 - Getting CIImages from a ProRAW
// Getting the preview image let isrc = CGImageSourceCreateWithURL(url as CFURL, nil) let cgimg = CGImageSourceCreateThumbnailAtIndex(isrc!, 0, nil) return CIImage(cgImage: cgimg)
-
18:36 - Getting CIImages from a ProRAW 2 (New in iOS 15 and macOS 12)
// Getting the preview image let rawFilter = CIRAWFilter(imageURL: url) return rawFilter.previewImage
-
18:44 - Getting CIImages from a ProRAW 3
// Getting the preview image let rawFilter = CIRAWFilter(imageURL: url) return rawFilter.previewImage // Getting segmentation mattes images return CIImage(contentsOf: url, options: [.auxiliarySemanticSegmentationSkinMatte : true])
-
18:56 - Getting CIImages from a ProRAW 4
// Getting the preview image let rawFilter = CIRAWFilter(imageURL: url) return rawFilter.previewImage // Getting segmentation mattes images let rawFilter = CIRAWFilter(imageURL: url) return rawFilter.semanticSegmentationSkinMatte
-
19:09 - Getting CIImages from a ProRAW 5
// Getting the primary image return CIImage(contentsOf: url, options:nil) let rawFilter = CIFilter(imageURL: url, options:nil) return rawFilter.outputImage
-
19:31 - Applying common user adjustments
func get_adjusted_raw_image (url: URL) -> CIImage? { // Load the image let rawFilter = CIFilter(imageURL: url, options:nil) // Change one or more filter inputs rawFilter.setValue(value, forKey: CIRAWFilterOption.keyName.rawValue) // Get the adjusted image return rawFilter.outputImage }
-
19:54 - Applying common user adjustments 2
func get_adjusted_raw_image (url: URL) -> CIImage? { // Load the image let rawFilter = CIRAWFilter(imageURL: url) // Change one or more filter inputs rawFilter.property = value // Get the adjusted image return rawFilter.outputImage }
-
20:17 - Applying common user adjustments 3
// Exposure rawFilter.exposure = -1.0 // Temperature and tint rawFilter.neutralTemperature = 6500 // in °K rawFilter.neutralTint = 0.0 // Sharpness rawFilter.sharpnessAmount = 0.5 // Local tone map strength rawFilter.localToneMapAmount = 0.5
-
21:40 - Getting linear scene-referred output 1
// Turn off the filter inputs that apply the default look to the RAW rawFilter.baselineExposure = 0.0 rawFilter.shadowBias = 0.0 rawFilter.boostAmount = 0.0 rawFilter.localToneMapAmount = 0.0 rawFilter.isGamutMappingEnabled = false let linearRawImage = rawFilter.outputImage
-
22:00 - Getting linear scene-referred output 2
// Use the linear image with other filters let histogram = CIFilter.areaHistogram() histogram.inputImage = linearRawImage histogram.extent = linearRawImage.extent // Or render it to a RGBAh buffer let rd = CIRenderDestination(bitmapData: data.mutableBytes, width: imageWidth, height: imageHeight, bytesPerRow: rowBytes, format: .RGBAh) rd.colorSpace = CGColorSpace(name: CGColorSpace.extendedLinearITUR_2020) let task = context.startTask(toRender: rawFilter.outputImage, from: rect, to: rd, at: point) task.waitUntilCompleted()
-
23:54 - Saving edits to other file formats 1 (8-bit HEIC)
// Saving to 8-bit HEIC try ciContext.writeHEIFRepresentation(of: rawFilter!.outputImage!, to: theURL, format: .RGBA8, colorSpace: CGColorSpace(name: CGColorSpace.displayP3)!, options: [:])
-
24:12 - Saving edits to other file formats 2 (10-bit HEIC)
// Saving to 10-bit HEIC try ciContext.writeHEIF10Representation(of: rawFilter!.outputImage!, to: theURL, format: .RGBA8, colorSpace: CGColorSpace(name: CGColorSpace.displayP3)!, options: [:])
-
24:51 - Displaying to a Metal Kit View in EDR on Mac
class MyView : MTKView { var context: CIContext var commandQueue: MTLCommandQueue //... }
-
25:13 - Displaying to a Metal Kit View in EDR on Mac
// Create a Metal Kit View subclass class MyView : MTKView { var context: CIContext var commandQueue: MTLCommandQueue //... } // Init your Metal Kit View for EDR colorPixelFormat = MTLPixelFormat.rgba16Float if let caml = layer as? CAMetalLayer { caml.wantsExtendedDynamicRangeContent = true //... } // Ask the filter for an image designed for EDR and render it rawFilter.extendedDynamicRangeAmount = 1.0 context.startTask(toRender: rawFilter.outputImage, from: rect, to: rd, at: point)
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。