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
,即未压缩)会产生大文件