我想构建一个 iOS 10 应用程序,让您拍摄 RAW ( .dng
) 图像,对其进行编辑,然后将编辑后的.dng
文件保存到相机胶卷。通过结合来自 Apple 2016 年“ AVCamManual ”和“ RawExpose ”示例应用程序的代码,我已经达到了CIFilter
包含 RAW 图像和编辑的地步。
但是,我不知道如何将结果CIImage
作为.dng
文件保存到相机胶卷。这可能吗?
RAW 文件是直接从相机传感器输出的“原始”文件,因此获取它的唯一方法是直接从相机中获取。处理完 RAW 文件后,根据定义,您所拥有的不再是“原始”文件,因此您无法返回 RAW。
为了扩展在 WWDC 上提出的隐喻,他们介绍了 RAW 摄影……RAW 文件就像蛋糕的原料。当您使用 Core Image 从 RAW 文件创建可视图像时,您正在烘烤蛋糕。(如前所述,有许多不同的方法可以用相同的原料烘焙蛋糕,这与处理 RAW 的可能选项相对应。)但是你不能取消烘焙蛋糕——没有办法回到原来的原料,更不用说一种以某种方式保留处理结果的方法。
因此,存储从 RAW 原件处理的图像的唯一方法是以位图图像格式保存处理后的图像。(如果您不介意有损压缩,请使用 JPEG,如果您需要无损压缩,请使用 PNG 或 TIFF 等)
如果您将编辑结果写入PHPhotoLibrary
,请使用 JPEG(如果您愿意,可以使用高质量/较少压缩),“照片”会将您的编辑存储为派生结果,允许用户恢复为 RAW 原始文件。您还可以描述您在PHAdjustmentData
编辑中保存的一组过滤器 - 使用调整数据,您的应用程序(或照片应用程序扩展)的另一个实例可以使用原始 RAW 数据和您保存的过滤器设置重建编辑,然后允许用户更改过滤器参数以创建不同的处理图像。
注意:有一个称为线性 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 指的是 Core Image。正如 rickster 所提到的,CI 处理处理过的图像数据,因此只提供处理过的图像结果(JPEG、TIFF):
CIContext.writeJPEGRepresentation(of:to:colorSpace:options:)
CIContext.writeTIFFRepresentation(of:to:format:colorSpace:options:)