您可以在 iOS 上保存编辑过的 RAW .dng 文件吗?

Can you save an edited RAW .dng file on iOS?

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

但是,我不知道如何将生成的 CIImage 作为 .dng 文件保存到相机胶卷。这可能吗?

遗憾的是,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"
)

RAW 文件 "raw" 直接从相机传感器输出,因此获取它的唯一方法是直接从相机获取。处理完 RAW 文件后,根据定义,您所拥有的不再是 "raw",因此您无法返回到 RAW。

延伸比喻presented at WWDC where they introduced RAW photography... RAW 文件就像蛋糕的配料。当您使用 Core Image 从 RAW 文件创建可视图像时,您就是在烘烤蛋糕。 (如前所述,有许多不同的方法可以用相同的原料烘烤蛋糕,对应于处理 RAW 的可能选项。)但是你不能取消烘烤蛋糕——没有回到原始原料的方法,更不用说了一种以某种方式保留处理结果的方法。

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

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


注意:有一个版本的 DNG 格式称为 Linear DNG 支持非 RAW(或 "not quite RAW")图像,但在实践中很少见,Apple 的图像堆栈不支持它。

这个答案来晚了,但它可能会帮助其他人解决这个问题。这就是我将原始照片作为 .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:)