.dng
RAW ( ) 画像を撮影して編集し、編集した.dng
ファイルをカメラロールに保存できる iOS 10 アプリを構築したいと考えています。Apple の 2016 年の「AVCamManual」および「RawExposeCIFilter
」サンプル アプリのコードを組み合わせることで、RAW 画像と編集内容を含むところまで到達しました。
CIImage
ただし、結果をファイルとしてカメラロールに保存する方法がわかりません.dng
。これは可能ですか?
RAW ファイルは、カメラ センサーから直接出力される「未加工」のファイルであるため、それを取得する唯一の方法は、カメラから直接取得することです。RAW ファイルを処理すると、定義上「生」ではないため、RAW に戻ることはできません。
RAW 写真を紹介した WWDC で提示された比喩を拡張すると、RAW ファイルはケーキの材料のようなものです。Core Image を使用して RAW ファイルから表示可能な画像を作成すると、ケーキを焼くことになります。(そして、前述のように、RAW を処理するための可能なオプションに対応して、同じ材料からケーキを焼くさまざまな方法があります。) しかし、ケーキを焼くことはできません。何らかの方法で処理の結果を保存します。
したがって、RAW 原稿から処理された画像を保存するには、処理された画像をビットマップ画像形式で保存するしかありません。(非可逆圧縮を気にしない場合は JPEG、可逆圧縮が必要な場合は PNG または TIFF などを使用してください。)
編集の結果を に書き込む場合は、PHPhotoLibrary
JPEG (高品質 / 必要に応じて圧縮率を下げる) を使用します。Photos は編集結果を派生結果として保存し、ユーザーが元の RAW に戻すことができるようにします。適用したフィルターのセットをPHAdjustmentData
編集と共に保存することもできます。調整データを使用すると、アプリ (または写真アプリの拡張機能) の別のインスタンスが、元の RAW データと保存したフィルター設定を使用して編集を再構築し、ユーザーがフィルター パラメーターを変更して、別の処理済み画像を作成します。
注:非 RAW (または「完全に RAW ではない」) 画像をサポートするLinear DNGと呼ばれる DNG 形式のバージョンがありますが、実際にはかなりまれであり、Apple の画像処理スタックはそれをサポートしていません。
残念ながら、DNG は Apple の ImageIO フレームワークの出力形式としてサポートされていません。サポートされている出力タイプのリストについては、CGImageDestinationCopyTypeIdentifiers() の出力を参照してください。
(
"public.jpeg",
"public.png",
"com.compuserve.gif",
"public.tiff",
"public.jpeg-2000",
"com.microsoft.ico",
"com.microsoft.bmp",
"com.apple.icns",
"com.adobe.photoshop-image",
"com.adobe.pdf",
"com.truevision.tga-image",
"com.sgi.sgi-image",
"com.ilm.openexr-image",
"public.pbm",
"public.pvr",
"org.khronos.astc",
"org.khronos.ktx",
"com.microsoft.dds",
"com.apple.rjpeg"
)
この回答は遅れていますが、他の人の問題に役立つ可能性があります。これは、生の写真をカメラロールに .dng ファイルとして保存する方法です。
念のため、AVFoundation のカメラを使用して写真をキャプチャしました。
import Photos
import AVFoundation
//reading in the photo data in as a data object
let photoData = AVCapturePhotoOutput.dngPhotoDataRepresentation(forRawSampleBuffer: sampleBuffer, previewPhotoSampleBuffer: previewPhotoSampleBuffer)
// put it into a temporary file
let temporaryDNGFileURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("temp.dng")!
try! photoData?.write(to: temporaryDNGFileURL)
// get access to photo library
PHPhotoLibrary.requestAuthorization { status in
if status == .authorized {
// Perform changes to the library
PHPhotoLibrary.shared().performChanges({
let options = PHAssetResourceCreationOptions()
options.shouldMoveFile = true
//Write Raw:
PHAssetCreationRequest.forAsset().addResource(with: .photo, fileURL: temporaryDNGFileURL, options: options)
}, completionHandler: { success, error in
if let error = error { print(error) }
})
}
else { print("cant access photo album") }
}
それが役に立てば幸い。
この応答の執筆時点 (iOS 10.1) で DNG データを取得する唯一の方法は次のとおりです。
AVCapturePhotoOutput.dngPhotoDataRepresentation(forRawSampleBuffer: CMSampleBuffer, previewPhotoSampleBuffer: CMSampleBuffer?)
OPはCore Imageを参照していることに注意してください。rickster が述べたように、CI は処理された画像データで動作するため、処理された画像の結果 (JPEG、TIFF) のみを提供します。
CIContext.writeJPEGRepresentation(of:to:colorSpace:options:)
CIContext.writeTIFFRepresentation(of:to:format:colorSpace:options:)