合成两个 CIImages 并在 UIImageView 问题中显示

Composite two CIImages and display in UIImageView issue

我在使用 CIFilter 合并两张图片时遇到了问题。这里出了什么问题?

下面的代码创建一个 UIImageView 并将其添加到视图中,然后将两个图像 imageAimageBCIFilter 组合,并将合成输出到UIImageView.

但是UIImageView中没有显示合成图像,它仍然是空白。


Questions:

  1. What is the correct code to display the composite image into the UIImageView?
  2. Is there more performant way in which to combine two images with CIFilter?

代码:

    let imageView = UIImageView()
    imageView.frame = CGRect(x: 0, y: 0, width: view.bounds.width, height: view.bounds.height)
    imageView.contentMode = .Center
    view.addSubview(imageView)

    let imageA = CIImage(image: UIImage(named:"imageA")!)
    let imageB = CIImage(image: UIImage(named:"imageB")!)
    let imageFilter = CIFilter(name: "CIAdditionCompositing")!

    imageFilter.setValue(imageA, forKey: kCIInputImageKey)
    imageFilter.setValue(imageB, forKey: kCIInputBackgroundImageKey)

    if let imageCombined = imageFilter.outputImage {
        let image = UIImage(CIImage: imageCombined)
        imageView.image = image
    }

我一直遇到直接 UIImage << >> CIImage 转换的问题。如果您有可以使用的 frame/size/extent,我建议您先使用 CIContext 并创建一个 CGImage

let ciContext = CIContext(options: nil)
let cgImg = ciContext.createCGImage(imageCombined, from: imageCombined.extent)
let uiImage = UIImage(cgImage: cgImg!)

请记住,创建 CIContext 是 "costly",因此如果您需要对多个图像执行此操作,请创建一个并将其用于所有渲染。此外,如果您在某个地方使用 GLKView,请使用它的上下文。

关于问题 #2,您的代码看起来不错。您可以 "combine lines of code but that does not affect performance. CoreImage doesn't "process" 任何东西,直到您调用过滤器的 outputImage.