WWDC Quick Look 💓 By SwiftGGTeam
Capture and process ProRAW images

Capture and process ProRAW images

元の動画を見る

ハイライト

Apple は、ProRAW の取得、ライブラリ ストレージ、RAW リソースの読み取り、および Core Image 編集を AVFoundation、PhotoKit、および Core Image に統合しました。開発者は、コンピュテーショナル フォトグラフィーの結果を使用して DNG RAW ファイルを独自のカメラや写真編集アプリで処理できます。

主な内容

カメラ アプリの 2 つの一般的なパスはどちらも問題ありません。 HEIC と JPEG は即時表示に適しており、ファイル サイズは小さく、システムはスマート HDR、ディープ フュージョン、またはナイト モード フュージョンを実行しています。写真ユーザーが後で調整する場合、マージンは限られています。 Bayer RAW はより多くのセンサー データを保持し、後処理のための余地がより多くありますが、開発者はデモザイク、ノイズ、レンダリング速度の問題に対処する必要があります。

ProRAW は、この生産チェーンを解決します。これは依然として標準の Adob​​e DNG ファイルに配置されており、システム フレームワークの ImageIO と Core Image はすでに基本的なサポートを備えています。そのピクセルは、マルチフレーム露出の融合によって生成できる、線形化されたシーン参照データから取得されます。デフォルトでは 12 ビット RGB ロスレス圧縮が使用され、ファイル サイズは通常 10 MB ~ 40 MB です。

開発者にとって、変更は 3 つの場所で発生します。撮影段階では、AVFoundation (オーディオおよびビデオ キャプチャ フレームワーク) を使用して ProRAW ピクセル フォーマットをリクエストします。保存段階では、PhotoKit (写真ライブラリ フレームワーク) を使用して DNG をメインの写真リソースとして保存します。編集段階ではCore Image(画像処理フレームワーク)を利用して読み込みます。CIRAWFilter、露出、ホワイトバランス、シャープネス、ローカルトーンマッピングを調整し、必要に応じて分析のために線形シーンデータを抽出します。

まずは撮影から

以前は、RAW カメラを作成する場合、開発者は通常、Bayer RAW か処理済み JPEG のどちらかを選択する必要がありました。 ProRAW を使用すると、アプリは Apple のコンピューテーショナル フォトグラフィーのデフォルトのルック アンド フィールを維持しながら、DNG ファイルを取得できます。ファイル内にフルサイズの JPEG プレビューを取り込むこともできるため、RAW + JPEG のデュアル リソースによって発生するライブラリ管理のコストが削減されます。

ギャラリーから続ける

ユーザーはすでに写真ライブラリに RAW ファイルを持っている可能性があります。 iOS 15の新機能.smartAlbumRAW、開発者は、システムの写真の RAW スマート アルバムに直接アクセスし、使用できます。PHAssetResourceManager実際のRAWデータを読み込みます。

エディタから実装まで

Core Image は、iOS 15 および macOS 12 の Swift により適した機能を追加しますCIRAWFilterAPI。文字列キーを使用して RAW フィルターを調整するだけでなく、開発者はプロパティを直接設定できます。 ProRAW のデフォルトのルック アンド フィールは DNG タグから来ています。これらのデフォルト入力をオフにすると、ヒストグラム、分析、またはカスタム レンダリング用の線形シーン リファレンス出力を取得することもできます。

##詳細

1. ProRAW をサポートする取得パイプラインを構成する

(07:52) ProRAW は最高品質の写真形式のみをサポートします。最も簡単な方法は、AVCaptureSession使用する.photoプリセット。 Apple はセッション開始前に有効にすることを推奨していますphotoOutput.isAppleProRAWEnabledそうしないと、時間のかかるパイプラインの再構成がトリガーされます。

import AVFoundation

private let session = AVCaptureSession()
private let photoOutput = AVCapturePhotoOutput()

private func configureSessionAndPhotoOutput() {
    session.beginConfiguration()
    session.sessionPreset = .photo

    photoOutput.isHighResolutionCaptureEnabled = true
    photoOutput.isAppleProRAWEnabled = photoOutput.isAppleProRAWSupported
    photoOutput.maxPhotoQualityPrioritization = .quality

    session.commitConfiguration()
}

キーポイント:

  • AVCaptureSession()カメラ取得セッションを作成します。
  • AVCapturePhotoOutput()静止画出力を担当します。
  • session.beginConfiguration()セッション構成のバッチ変更を開始します。
  • session.sessionPreset = .photo最高品質の写真をサポートするプリセットを選択してください。
  • photoOutput.isHighResolutionCaptureEnabled = true高解像度の写真コレクションを有効にします。
  • photoOutput.isAppleProRAWEnabled = photoOutput.isAppleProRAWSupportedデバイスが ProRAW をサポートしている場合にのみ ProRAW を有効にしてください。
  • photoOutput.maxPhotoQualityPrioritization = .quality最高の写真品質の優先順位を「品質優先」に設定します。
  • session.commitConfiguration()構成を送信します。

(09:26) ProRAW を有効にした後、availableRawPhotoPixelFormatTypesProRAW ピクセル形式が含まれます。使用AVCapturePhotoOutput.isAppleProRAWPixelFormat(_:)ProRAW と Bayer RAW を区別します。

import AVFoundation

func firstProRAWPixelFormat(from photoOutput: AVCapturePhotoOutput) -> OSType? {
    return photoOutput.availableRawPhotoPixelFormatTypes.first { pixelFormat in
        AVCapturePhotoOutput.isAppleProRAWPixelFormat(pixelFormat)
    }
}

キーポイント:

  • availableRawPhotoPixelFormatTypes現在の出力でサポートされている RAW ピクセル形式を返します。
  • first { pixelFormat in ... }リストから最初の ProRAW 形式を見つけます。
  • isAppleProRAWPixelFormat(pixelFormat)形式が Apple ProRAW であるかどうかを確認します。
  • 関数の戻り値OSType?、見つからない場合に戻りますnilの場合、呼び出し元は、そのデバイスまたは形式がサポートされていないものとして扱う必要があります。

2. ProRAW撮影設定を作成する

(10:09) ProRAWのみで撮影する場合、AVCapturePhotoSettings(rawPixelFormatType:)それで十分です。加工した写真も同時に取得したい場合は、processedFormat。 session は、これによりアプリが複数のリソースを処理するようになり、PhotoKit での追跡が困難になると述べました。

import AVFoundation

func makeProRAWSettings(
    photoOutput: AVCapturePhotoOutput,
    proRawPixelFormat: OSType
) -> AVCapturePhotoSettings? {
    guard let processedPhotoCodecType = photoOutput.availablePhotoCodecTypes.first else {
        return nil
    }

    let photoSettings = AVCapturePhotoSettings(
        rawPixelFormatType: proRawPixelFormat,
        processedFormat: [AVVideoCodecKey: processedPhotoCodecType]
    )

    return photoSettings
}

キーポイント:

  • availablePhotoCodecTypes.first現在の出力でサポートされている処理済みの写真のエンコード形式を取得します。
  • guard使用可能なエンコード形式がない場合は、早期に戻ります。
  • AVCapturePhotoSettings(rawPixelFormatType:processedFormat:)ProRAW と処理済みの写真の両方を含むショット リクエストを作成します。
  • AVVideoCodecKey処理された写真に使用されるエンコードのタイプを指定します。
  • 戻るAVCapturePhotoSettings?、呼び出し元は、サムネイル、プレビュー、品質優先度を取得した後も追加し続けます。

(10:53) ProRAW は、DNG へのフルサイズの JPEG サムネイルの埋め込みをサポートしています。 Apple は、セッションでこのモデルを使用して、RAW + JPEG デュアル リソースを置き換えることを提案しました。ギャラリーの占有スペースが減り、ユーザー エクスペリエンスがより明確になります。

import AVFoundation

func addEmbeddedThumbnail(
    to photoSettings: AVCapturePhotoSettings,
    device: AVCaptureDevice
) {
    guard let thumbnailPhotoCodecType = photoSettings.availableRawEmbeddedThumbnailPhotoCodecTypes.first else {
        return
    }

    let dimensions = device.activeFormat.highResolutionStillImageDimensions

    photoSettings.rawEmbeddedThumbnailPhotoFormat = [
        AVVideoCodecKey: thumbnailPhotoCodecType,
        AVVideoWidthKey: dimensions.width,
        AVVideoHeightKey: dimensions.height
    ]
}

キーポイント:

  • availableRawEmbeddedThumbnailPhotoCodecTypes.firstDNG 埋め込みサムネイルに使用可能なエンコーディングを取得します。
  • device.activeFormat.highResolutionStillImageDimensions現在の形式で高解像度の写真の寸法を読み取ります。
  • rawEmbeddedThumbnailPhotoFormatインラインサムネイルの形式を設定します。
  • AVVideoWidthKeyそしてAVVideoHeightKey指定したサイズのサムネイルを作成します。

(11:08) 撮影前にこのリクエストに対して品質優先とクイック プレビューを設定することもできます。こちらですphotoQualityPrioritization正面から先には進めないphotoOutput.maxPhotoQualityPrioritization

import AVFoundation

func finishProRAWSettings(
    _ photoSettings: AVCapturePhotoSettings,
    photoOutput: AVCapturePhotoOutput,
    delegate: AVCapturePhotoCaptureDelegate
) {
    photoSettings.photoQualityPrioritization = .quality

    if let previewPixelFormat = photoSettings.availablePreviewPhotoPixelFormatTypes.first {
        photoSettings.previewPhotoFormat = [
            kCVPixelBufferPixelFormatTypeKey as String: previewPixelFormat
        ]
    }

    photoOutput.capturePhoto(with: photoSettings, delegate: delegate)
}

キーポイント:

  • photoQualityPrioritization = .qualityこの撮影の品質を優先させてください。
  • availablePreviewPhotoPixelFormatTypes.first使用可能なプレビュー ピクセル形式の 1 つを取得します。
  • previewPhotoFormatクイック プレビューをリクエストします。
  • capturePhoto(with:delegate:)ProRAW 撮影は、同じ静止画 API を使用して開始されます。

3. DNG ファイルを受信し、圧縮をカスタマイズする

11:44didFinishProcessingPhoto受け取りますAVCapturePhoto。プレビューをリクエストした場合は、次から実行できます。previewPixelBuffer表示画像を取得します。使用isRawPhoto使用する前に ProRAW と処理された写真を区別してくださいfileDataRepresentation()DNGデータを取得します。

import AVFoundation

final class ProRAWCaptureDelegate: NSObject, AVCapturePhotoCaptureDelegate {
    var proRAWFileDataRepresentation: Data?
    var proRAWPixelBuffer: CVPixelBuffer?
    var previewPixelBuffer: CVPixelBuffer?

    func photoOutput(
        _ output: AVCapturePhotoOutput,
        didFinishProcessingPhoto photo: AVCapturePhoto,
        error: Error?
    ) {
        guard error == nil else {
            return
        }

        if let preview = photo.previewPixelBuffer {
            previewPixelBuffer = preview
        }

        if photo.isRawPhoto {
            guard let fileData = photo.fileDataRepresentation() else {
                return
            }
            guard let pixelBuffer = photo.pixelBuffer else {
                return
            }

            proRAWFileDataRepresentation = fileData
            proRAWPixelBuffer = pixelBuffer
        }
    }
}

キーポイント:

  • AVCapturePhotoCaptureDelegate写真処理完了コールバックを受信します。
  • guard error == nilフィルター収集に失敗しました。
  • photo.previewPixelBuffer非圧縮プレビューが提供されており、これを使用してインターフェイスを迅速に更新できます。
  • photo.isRawPhoto現在のコールバックが RAW 写真であるかどうかを判断します。
  • photo.fileDataRepresentation()保存可能な ProRAW DNG ファイル データを返します。
  • photo.pixelBufferカスタム処理チェーンの継続に適した RAW ピクセル データを返します。

(12:52) ProRAW は、デフォルトで 12 ビット コンパンディング カーブのロスレス エンコーディングを使用します。合格AVCapturePhotoFileDataRepresentationCustomizer、開発者は、可逆圧縮のビット深度を減らすか、品質値を 1 未満に設定して 8 ビットの非可逆圧縮を使用できます。

import AVFoundation

final class AppleProRAWCustomizer: NSObject, AVCapturePhotoFileDataRepresentationCustomizer {
    func replacementAppleProRAWCompressionSettings(
        for photo: AVCapturePhoto,
        defaultSettings: [String: Any],
        maximumBitDepth: Int
    ) -> [String: Any] {
        return [
            AVVideoAppleProRAWBitDepthKey: min(10, maximumBitDepth),
            AVVideoQualityKey: 1.00
        ]
    }
}

キーポイント:

  • AVCapturePhotoFileDataRepresentationCustomizerProRAW ファイルのデータ表現をオーバーライドするために使用される圧縮設定。
  • replacementAppleProRAWCompressionSettings新しい圧縮パラメータを返します。
  • maximumBitDepth現在の写真に許可される最大ビット深度です。
  • min(10, maximumBitDepth)可逆圧縮のビット深度を 10 ビット以下の使用可能な値に制限します。
  • AVVideoQualityKey: 1.00可逆圧縮を維持します。

(13:51) ファイルデータを生成するときにカスタマイザーを渡しますfileDataRepresentation(with:)、新しい圧縮設定に従って DNG を出力できます。

import AVFoundation

func customizedProRAWData(from photo: AVCapturePhoto) -> Data? {
    guard photo.isRawPhoto else {
        return nil
    }

    let customizer = AppleProRAWCustomizer()
    return photo.fileDataRepresentation(with: customizer)
}

キーポイント:

  • guard photo.isRawPhotoRAW 写真のみを処理するようにしてください。
  • AppleProRAWCustomizer()圧縮設定カスタマイザーを作成します。
  • fileDataRepresentation(with:)カスタマイザーでProRAW DNGデータを生成します。
  • 戻るData?、生成が失敗した場合、呼び出し元は処理する必要があります。nil

4. PhotoKit を使用して RAW リソースを保存および読み取ります

(15:19) ProRAW をギャラリーに保存するときは、DNG ファイルを次のように使用します。.photoメインリソースが追加されましたPHAssetCreationRequest。セッションでは、ProRAW のインライン プレビューを使用し、古い RAW + JPEG デュアル リソース モデルを非推奨にすることを明示的に推奨しています。

import PhotoKit

func saveProRAWToPhotoLibrary(proRawFileURL: URL) {
    PHPhotoLibrary.shared().performChanges {
        let creationRequest = PHAssetCreationRequest.forAsset()
        creationRequest.addResource(
            with: .photo,
            fileURL: proRawFileURL,
            options: nil
        )
    } completionHandler: { success, error in
        if success {
            return
        }

        _ = error
    }
}

キーポイント:

  • PHPhotoLibrary.shared().performChangesフォト ライブラリ トランザクションでライブラリを変更します。
  • PHAssetCreationRequest.forAsset()新しい写真リソース リクエストを作成します。
  • addResource(with:.photo,fileURL:options:)ProRAW DNG をメインの写真アセットとして保存します。
  • completionHandler保存結果とエラーを受信します。

(15:45) iOS 15 新しい.smartAlbumRAW。これは写真アプリの RAW アルバムに相当し、RAW リソースを含むアセットが含まれています。

import PhotoKit

func fetchRAWSmartAlbum() -> PHFetchResult<PHAssetCollection> {
    return PHAssetCollection.fetchAssetCollections(
        with: .smartAlbum,
        subtype: .smartAlbumRAW,
        options: nil
    )
}

キーポイント:

  • PHAssetCollection.fetchAssetCollectionsアセット コレクションをクエリします。
  • .smartAlbumシステムスマートアルバムのタイプを指定します。
  • .smartAlbumRAWRAWスマートアルバムを指定します。
  • 戻るPHFetchResult<PHAssetCollection>を呼び出した場合、呼び出し元は引き続きアセットを取得できます。

(17:16) 読むPHAssetRAWデータの最初の列挙PHAssetResource、ただ見てください.photoそして.alternatePhoto、次に使用しますUTType.rawImageリソースの種類を決定します。

import PhotoKit
import UniformTypeIdentifiers

func requestRAWData(for asset: PHAsset, dataHandler: @escaping (Data) -> Void) {
    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
                        dataHandler(data)
                    } completionHandler: { error in
                        _ = error
                    }
                }
            }
        }
    }
}

キーポイント:

  • PHAssetResource.assetResources(for:)アセットの下にあるすべてのリソースを削除します。
  • .photoがメインの写真リソースです。.alternatePhoto古い RAW + JPEG モデルの RAW リソースの場所です。
  • UTType(resource.uniformTypeIdentifier)リソース UTI を型オブジェクトに変換します。
  • conforms(to: UTType.rawImage)リソースが RAW 画像かどうかを確認します。
  • PHAssetResourceManager.default()リソースデータの読み取りを担当します。
  • requestData(for:options:dataReceivedHandler:completionHandler:)データはチャンクで返され、最後に完了コールバックが呼び出されます。

5. Core Image を使用した ProRAW のロード、編集、エクスポート

(18:36) iOS 15 および macOS 12CIRAWFilterプレビュー画像を読み込むための便利なAPIを追加しました。直接行くより良いですCGImageSourceCreateThumbnailAtIndexRAW編集のプロセスに迫ります。

import CoreImage

func previewImage(from url: URL) -> CIImage? {
    let rawFilter = CIRAWFilter(imageURL: url)
    return rawFilter.previewImage
}

キーポイント:

  • CIRAWFilter(imageURL:)ProRAW ファイルから RAW フィルターを作成します。
  • previewImageDNG 内のプレビュー イメージを返します。 -戻り値はCIImage?ファイルのプレビューが利用できない場合は、空になる可能性があります。

(19:54) アプリが編集機能を提供したい場合は、CIRAWFilterそしてプロパティを変更します。セッションで表示される一般的な調整には、露出、色温度、色合い、シャープネス、ローカル トーン マッピングが含まれます。

import CoreImage

func adjustedRawImage(url: URL) -> CIImage? {
    let rawFilter = CIRAWFilter(imageURL: url)

    rawFilter.exposure = -1.0
    rawFilter.neutralTemperature = 6500
    rawFilter.neutralTint = 0.0
    rawFilter.sharpnessAmount = 0.5
    rawFilter.localToneMapAmount = 0.5

    return rawFilter.outputImage
}

キーポイント:

  • CIRAWFilter(imageURL:)変更可能な RAW フィルターを作成します。
  • exposure = -1.0画像の明るさを元の値の半分に調整します。
  • neutralTemperature = 6500シーンの中性点温度をケルビン単位で設定します。
  • neutralTint = 0.0色相オフセットを設定します。
  • sharpnessAmount = 0.5デフォルトのシャープネス強度を半分に設定します。
  • localToneMapAmount = 0.5ローカル トーン マップの強度を半分に設定します。
  • outputImageこれらの RAW パラメータを適用して画像を生成します。

(21:40) ProRAW のデフォルトのルック アンド フィールは、DNG タグによって決まります。リニア シーン リファレンス データを取得するには、デフォルトのルック アンド フィール関連の入力をオフにして、それを読み取る必要があります。outputImage

import CoreImage

func linearSceneReferredImage(url: URL) -> CIImage? {
    let rawFilter = CIRAWFilter(imageURL: url)

    rawFilter.baselineExposure = 0.0
    rawFilter.shadowBias = 0.0
    rawFilter.boostAmount = 0.0
    rawFilter.localToneMapAmount = 0.0
    rawFilter.isGamutMappingEnabled = false

    return rawFilter.outputImage
}

キーポイント:

  • baselineExposure = 0.0デフォルトのベースライン露出をオフにします。
  • shadowBias = 0.0デフォルトのシャドウバイアスをオフにします。
  • boostAmount = 0.0デフォルトのブーストをオフにします。
  • localToneMapAmount = 0.0ローカルトーンマッピングをオフにします。
  • isGamutMappingEnabled = false色域マッピングをオフにします。
  • outputImage分析に使用したり、他のコア イメージ フィルターへの継続入力に使用できるリニア シーン参照イメージを返します。

(23:54) 編集が完了すると、アプリはrawFilter.outputImage8 ビット HEIC として書き込まれます。セッションでは、出力カラー スペースに Display P3 を使用することを推奨します。

import CoreImage

func writeHEIC(
    rawFilter: CIRAWFilter,
    ciContext: CIContext,
    to theURL: URL
) throws {
    guard let outputImage = rawFilter.outputImage else {
        return
    }

    try ciContext.writeHEIFRepresentation(
        of: outputImage,
        to: theURL,
        format: .RGBA8,
        colorSpace: CGColorSpace(name: CGColorSpace.displayP3)!,
        options: [:]
    )
}

キーポイント:

  • rawFilter.outputImage編集した RAW 出力を取得します。
  • guard出力画像がない場合は直接リターンします。
  • writeHEIFRepresentationHEICファイルを書き出します。
  • format: .RGBA88 ビット RGBA 出力形式を使用します。
  • CGColorSpace.displayP3Display P3 カラースペースを使用します。
  • options: [:]デフォルトの書き込みオプションをそのまま使用します。

(25:13) 拡張ダイナミック レンジ (EDR) をサポートする Mac ディスプレイでは、Apple は、MTKViewサブクラスは ProRAW を示します。使用状況を表示するrgba16FloatCAMetalLayerEDR コンテンツを開き、rawFilter.extendedDynamicRangeAmount1に設定します。

import CoreImage
import MetalKit

class MyView: MTKView {
    var context: CIContext
    var commandQueue: MTLCommandQueue

    init(frame frameRect: CGRect, device: MTLDevice, context: CIContext, commandQueue: MTLCommandQueue) {
        self.context = context
        self.commandQueue = commandQueue
        super.init(frame: frameRect, device: device)

        colorPixelFormat = MTLPixelFormat.rgba16Float

        if let caml = layer as? CAMetalLayer {
            caml.wantsExtendedDynamicRangeContent = true
        }
    }

    required init(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func prepareForEDRDisplay(rawFilter: CIRAWFilter) {
        rawFilter.extendedDynamicRangeAmount = 1.0
    }
}

キーポイント:

  • MTKViewCore Image 出力を Metal レンダリングに渡すのに適しています。
  • CIContextコアイメージのレンダリングを担当します。
  • MTLCommandQueueMetal コマンドの送信を担当します。
  • colorPixelFormat = .rgba16Floatビューで半浮動小数点ピクセル形式を使用します。
  • wantsExtendedDynamicRangeContent = trueMetal レイヤーに EDR コンテンツを表示できるようにします。
  • extendedDynamicRangeAmount = 1.0RAW フィルター出力 EDR バージョンをリクエストします。

重要なポイント

  • やるべきこと: 写真家向けに ProRAW カメラを作成します。 価値がある理由: AVFoundation は ProRAW DNG を直接リクエストし、フルサイズの JPEG プレビューを埋め込むことができます。 開始方法: を使用します.photoプリセット構成AVCaptureSession、 有効にするphotoOutput.isAppleProRAWEnabled、選ぶisAppleProRAWPixelFormat呼び出す前に true のピクセル形式を返します。capturePhoto(with:delegate:)

  • 何をすべきか: ユーザーの写真ライブラリ内の RAW ファイルを自動的に検索する RAW ライブラリ オーガナイザー ツールを作成します。 実行する価値がある理由: iOS 15.smartAlbumRAWRAW アセットを含むアセットを直接見つける機能。 開始方法: を使用しますPHAssetCollection.fetchAssetCollections(with:subtype:options:)RAW スマート フォト アルバムを入手して再度使用するPHAssetResource.assetResources(for:)そしてUTType.rawImageDNG データを検索します。

  • やるべきこと: 軽量の ProRAW カラー パレットを作成します。 実行する価値がある理由:CIRAWFilter露出、色温度、色合い、シャープネス、ローカル トーン マッピングなどの一般的に使用される調整プロパティが公開されています。 開始方法: ファイル URL から作成CIRAWFilter(imageURL:)、スライダー値をにマッピングしますexposureneutralTemperatureneutralTintsharpnessAmountlocalToneMapAmount、リアルタイム表示outputImage

  • やるべきこと: ハイダイナミックレンジ解析ツールを作成します。 実行する価値がある理由: デフォルトのルック アンド フィール入力をオフにすると、ヒストグラムまたは明るさの統計用の線形シーン参照画像を取得できます。 開始方法:baselineExposureshadowBiasboostAmountlocalToneMapAmountオフにするには 0 に設定しますisGamutMappingEnabled、 またoutputImageに渡すCIFilter.areaHistogram()

  • やるべきこと: Mac 用の EDR ProRAW ビューアを作成します。 価値がある理由: ProRAW のダイナミック レンジは、MetalKit View を使用して EDR 対応 Mac ディスプレイでレンダリングできます。 開始方法: 作成するMTKViewサブクラス、設定colorPixelFormat = .rgba16Float、右CAMetalLayer開けるwantsExtendedDynamicRangeContent、レンダリング前に設定rawFilter.extendedDynamicRangeAmount = 1.0

関連セッション

コメント

GitHub Issues · utterances