繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM