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

时间:2016-09-14 18:15:54

标签: ios ios10 cifilter dng

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

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

4 个答案:

答案 0 :(得分:4)

不幸的是,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"
)

答案 1 :(得分:4)

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数据和过滤器设置重建编辑保存,然后允许用户更改过滤器参数以创建不同的已处理图像。

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

答案 2 :(得分:1)

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

希望它有所帮助。

答案 3 :(得分:0)

在编写此响应(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:)