iOS AVFoundation:将CIFilter应用于AVCapturePhoto中的照片以进行保存的最佳方法

iOS AVFoundation:将CIFilter应用于AVCapturePhoto中的照片以进行保存的最佳方法,ios,avfoundation,cifilter,ciimage,Ios,Avfoundation,Cifilter,Ciimage,在我的AVCapturePhotoCaptureDelegate方法内public func photoOutput(uu)output:AVCapturePhotoOutput,didfishProcessingPhoto photo:AVCapturePhoto,error:error?我需要保存带有过滤效果的照片,看起来我需要CIImage才能使CIFilter正常工作 我可以这样做: let ciImage = CIImage(UIImage(photo.fileDataRepresen

在我的
AVCapturePhotoCaptureDelegate
方法内
public func photoOutput(uu)output:AVCapturePhotoOutput,didfishProcessingPhoto photo:AVCapturePhoto,error:error?
我需要保存带有过滤效果的照片,看起来我需要
CIImage
才能使
CIFilter
正常工作

我可以这样做:

let ciImage = CIImage(UIImage(photo.fileDataRepresentation())
// ...apply filter
let uiImage = UIImage(ciImage: filter.outputImage!)
let data = uiImage.jpegData(compressionQuality: 1.0)
// ...save data using PHAssetCreationRequest
然而,它涉及到一些图像和数据转换,我想知道是否有更好的方法来做到这一点


谢谢

是的,您可以在此处避免
UIImage
转换

首先,在某个地方创建一个
CIContext
,并在每次过滤图像时重复使用它,因为创建一个图像的成本很高。这是为您执行实际图像过滤的对象(在使用
CIImage
初始化的
UIImage
上调用
jpegData
时,这也会发生在引擎盖下)。默认参数(
let context=CIContext()
)应该可以正常工作

然后在回调中,您可以执行以下操作:

let ciImage = CIImage(data: photo.fileDataRepresentation())
// apply filter...
let colorSpace = CGColorSpace(name: CGColorSpace.displayP3)! // or .sRGB, but you camera can most likely shoot P3
let outputData = self.ciContext.jpegRepresentation(of: filter.outputImage!, colorSpace: colorSpace, 
                                                   options: [kCGImageDestinationLossyCompressionQuality: 0.9])
// save data...

如果要另存为HEIF,也可以使用
heifresentation
。显然,您还可以修改压缩质量。我只是将其添加到示例中,因为默认值(
1.0,即未压缩)会导致大文件。

是的,您可以在此处避免
UIImage
转换

首先,在某个地方创建一个
CIContext
,并在每次过滤图像时重复使用它,因为创建一个图像的成本很高。这是为您执行实际图像过滤的对象(在使用
CIImage
初始化的
UIImage
上调用
jpegData
时,这也会发生在引擎盖下)。默认参数(
let context=CIContext()
)应该可以正常工作

然后在回调中,您可以执行以下操作:

let ciImage = CIImage(data: photo.fileDataRepresentation())
// apply filter...
let colorSpace = CGColorSpace(name: CGColorSpace.displayP3)! // or .sRGB, but you camera can most likely shoot P3
let outputData = self.ciContext.jpegRepresentation(of: filter.outputImage!, colorSpace: colorSpace, 
                                                   options: [kCGImageDestinationLossyCompressionQuality: 0.9])
// save data...
如果要另存为HEIF,也可以使用
heifresentation
。显然,您还可以修改压缩质量。我只是将其添加到示例中,因为默认值(
1.0
,即未压缩)会产生大文件