这个问题在这里已有答案:
我在将两张图片与CIFilter
合并时遇到了麻烦。这里出了什么问题?
下面的代码创建一个UIImageView
并将其添加到视图中,然后将两个图像imageA
和imageB
与CIFilter
组合,并将复合输出到UIImageView
。
但是,组合图像不会显示在UIImageView
中,它仍然是空白的。
问题:
- 将合成图像显示到
UIImageView
的正确代码是什么?- 是否有更高效的方式将两个图像与
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
转换的问题。如果你有框架/尺寸/范围你可以使用,我建议使用CIContext
并首先创建一个CGImage
:
let ciContext = CIContext(options: nil)
let cgImg = ciContext.createCGImage(imageCombined, from: imageCombined.extent)
let uiImage = UIImage(cgImage: cgImg!)
请记住,创建CIContext
是“昂贵的”,因此如果您需要为多个图像执行此操作,请创建一个并将其用于所有渲染。此外,如果你在某个地方使用GLKView
,请使用它的上下文。
关于问题#2,您的代码看起来很好。您可以“组合代码行,但这不会影响性能。在您调用过滤器的outputImage
之前,CoreImage不会”处理“任何内容。