【问题标题】:iOS AVFoundation: Best way to apply CIFilter to photos from AVCapturePhoto for savingiOS AVFoundation:将 CIFilter 应用于 AVCapturePhoto 中的照片以进行保存的最佳方法
【发布时间】:2021-03-27 22:24:02
【问题描述】:

在我的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

但是,这涉及到一些图像和数据的转换,不知道有没有更好的方法呢?

谢谢!

【问题讨论】:

    标签: ios avfoundation cifilter ciimage


    【解决方案1】:

    是的,您可以在此处避免 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,也可以使用 heifRepresentation。而且您显然还可以修改压缩质量。我只是将它添加到示例中,因为默认(1.0,即未压缩)会生成大文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 2014-01-04
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多