[英]iOS AVFoundation: Best way to apply CIFilter to photos from AVCapturePhoto for saving
在我的AVCapturePhotoCaptureDelegate
方法中public func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto 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
并在每次过滤图像时重新使用它,因为创建一个图像的成本很高。 这是为您执行实际图像过滤的 object(当您在使用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,也可以使用heifRepresentation
。 而且您显然还可以修改压缩质量。 我只是将它添加到示例中,因为默认值( 1.0
,即未压缩)会生成大文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.