你能在iOS上保存一个编辑好的RAW .dng文件吗?

我想构建一个iOS 10应用程序,让您拍摄RAW( .dng )图像,编辑它,然后将编辑过的.dng文件保存到相机胶卷。 通过结合Apple 2016的“ AVCamManual ”和“ RawExpose ”示例应用程序中的代码,我已经达到了我有一个包含RAW图像的CIFilter以及编辑的程度。

但是,我无法弄清楚如何将生成的CIImage保存为相机胶卷作为.dng文件。 这可能吗?

RAW文件是直接来自相机传感器的“原始”输出,因此获取它的唯一方法是直接来自相机。 一旦你处理了一个RAW文件,你所拥有的就不再是“原始”了,所以你不能回到RAW。

为了扩展WWDC上介绍RAW摄影的比喻… RAW文件就像蛋糕的成分。 当您使用Core Image从RAW文件创建可视图像时,您正在烘焙蛋糕。 (并且如上所述,有许多不同的方法可以用相同的成分烘焙蛋糕,对应于处理RAW的可能选项。)但是你不能烘烤蛋糕 – 没有回到原始成分,更不用说以某种方式保留处理结果的方式。

因此,存储从RAW原件处理的图像的唯一方法是将处理后的图像保存为位图图像格式。 (如果您不介意有损压缩,请使用JPEG,如果您需要无损,请使用PNG或TIFF等)

如果您正在将编辑结果写入PHPhotoLibrary ,请使用JPEG(如果您愿意,可以使用高质量/较少压缩),而照片会将您的编辑存储为派生结果,从而允许用户恢复为RAW原件。 您还可以描述您在PHAdjustmentData保存的PHAdjustmentData应用的一组filter – 使用调整数据,您应用的另一个实例(或照片应用扩展程序)可以使用原始RAW数据加上您保存的filter设置重建编辑,然后允许用户更改filter参数以创建不同的已处理图像。


注意:有一种名为Linear DNG的DNG格式版本支持非RAW(或“不完全RAW”)图像,但在实践中它很少见,Apple的成像堆栈不支持它。

不幸的是,Apple的ImageIO框架中不支持DNG作为输出格式。 有关支持的输出类型列表,请参阅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指的是核心图像。 如rickster所述,CI适用于已处理的图像数据,因此仅提供已处理的图像结果(JPEG,TIFF):

 CIContext.writeJPEGRepresentation(of:to:colorSpace:options:) CIContext.writeTIFFRepresentation(of:to:format:colorSpace:options:)