我们可以要求 AVFoundation 以 BGRA 等已处理格式捕捉照片,或者要求它捕捉 RAW,然后使用 Core Image 将其处理为 BGRA。后者让我们可以控制过程中使用的参数,而不是将其留给 iOS 使用的默认值。
就我而言,我想关闭降噪功能,否则图像类似于 BGRA。所以我尝试了:
let rawData = AVCapturePhotoOutput.dngPhotoDataRepresentation(forRawSampleBuffer: self,
previewPhotoSampleBuffer: nil)!
let options: [AnyHashable : Any] = [
kCIInputNoiseReductionAmountKey: 0.0,
kCIInputLuminanceNoiseReductionAmountKey: 0.0,
kCIInputColorNoiseReductionAmountKey: 0.0]
let rawFilter = CIFilter(imageData: rawData, options: options)!
let outputImage = rawFilter.outputImage!
let context = CIContext()
let cgImage = context.createCGImage(outputImage, from: outputImage.extent)!
let uiImage = UIImage(cgImage: cgImage)
let data = UIImageJPEGRepresentation(uiImage, jpegQuality)!
// Save the data using PHPhotoLibrary
但这会导致RAW看起来更亮......
... 比 BGRA:
右键单击照片并在新选项卡中打开以查看差异。
这只是一张照片,作为一个例子。我测试了许多不同的场景,发现无论我尝试什么设置,我都无法匹配 JPEG 的质量——它太亮、太暗、或者对比度太大等等。
然后我注意到有一个输入 boost 参数,其默认值为 1 用于完全提升,所以我将其设置为 0:
let options: [AnyHashable: Any] = [kCIInputBoostKey: 0.0]
但这会产生一个没有足够对比度的暗淡图像:
所以,问题是我应该使用什么设置让 Core Image 将 RAW 开发为 BGRA,其视觉外观与 AVFoundation 捕获的 BGRA 相同,但没有降噪。