我想构建一个iOS 10应用程序,让您拍摄RAW (.dng
)图像,编辑它,然后将编辑后的.dng
文件保存到相机胶卷中。通过结合苹果2016年"AVCamManual"one_answers"RawExpose"示例应用程序的代码,我已经达到了包含RAW图像以及编辑的CIFilter
的地步。
然而,我不知道如何将产生的CIImage
保存到相机卷作为.dng
文件。这可能吗?
RAW文件是直接来自相机传感器的"原始"输出,因此获取它的唯一方法是直接从相机获取。一旦你处理了一个RAW文件,根据定义,你得到的就不再是"RAW"了,所以你不能回到RAW。
在WWDC上,他们介绍了RAW摄影。RAW文件就像蛋糕的配料。当您使用Core Image从RAW文件创建可查看的图像时,您正在烘烤蛋糕。(如上所述,用同样的原料烤蛋糕有很多不同的方法,对应于加工RAW的可能选择。)但是你不能取消蛋糕的烘焙——没有办法回到原来的原料,更不用说以某种方式保留你加工的结果了。因此,存储从RAW原始图像处理后的图像的唯一方法是将处理后的图像保存为位图图像格式。(如果您不介意有损压缩,请使用JPEG,如果您需要无损压缩,请使用PNG或TIFF等)
如果您将编辑结果写入PHPhotoLibrary
,请使用JPEG(如果您喜欢,可以使用高质量/较少压缩),并且Photos将将您的编辑存储为派生结果,允许用户恢复到原始RAW。你也可以描述你在PHAdjustmentData
中应用的过滤器的集合与你的编辑保存-调整数据,你的应用程序(或照片应用程序扩展)的另一个实例可以重建使用原始的RAW数据加上你保存的过滤器设置编辑,然后允许用户改变过滤器参数来创建一个不同的处理图像。
注意:有一个版本的DNG格式称为线性DNG,支持非RAW(或"不完全RAW")图像,但在实践中相当罕见,苹果的成像堆栈不支持它
不幸的是,苹果的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"
)
这个答案来得晚了,但它可能会帮助其他人解决这个问题。这就是我如何将原始照片保存为。ng文件到相机胶卷上的方法。
只是要注意,我是用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:)