合成两个 CIImages 并在 UIImageView 问题中显示
Composite two CIImages and display in UIImageView issue
我在使用 CIFilter
合并两张图片时遇到了问题。这里出了什么问题?
下面的代码创建一个 UIImageView
并将其添加到视图中,然后将两个图像 imageA
和 imageB
与 CIFilter
组合,并将合成输出到UIImageView
.
但是UIImageView
中没有显示合成图像,它仍然是空白。
Questions:
- What is the correct code to display the composite image into the
UIImageView
?
- 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
.
我在使用 CIFilter
合并两张图片时遇到了问题。这里出了什么问题?
下面的代码创建一个 UIImageView
并将其添加到视图中,然后将两个图像 imageA
和 imageB
与 CIFilter
组合,并将合成输出到UIImageView
.
但是UIImageView
中没有显示合成图像,它仍然是空白。
Questions:
- What is the correct code to display the composite image into the
UIImageView
?- 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
.