一尘不染

为什么我无法在Swift iOS应用中使用CIFilter将图像恢复为原始图像

swift

我正在开发一个简单的应用程序。它具有带有预加载图像和按钮的图像视图。按下按钮时,应在图像视图中反转图像。

它是第一次工作,但是我希望当我再次按下该按钮时,它可以将图像转换回其原始形式。但是,第二次按下按钮时,它崩溃了。

这是来自的相关代码ViewController.swift

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var invertButton: UIButton!

    @IBAction func invertButtonPressed(sender: UIButton) {
        let beginImage = CIImage(image: imageView.image!)
        let filter = CIFilter(name: "CIColorInvert")!
        filter.setValue(beginImage, forKey: kCIInputImageKey)
        imageView.image = UIImage(CIImage: (filter.outputImage)!)
    }

基本上,beginImage成为nil第二次左右,我不知道为什么。我尝试通过将这些密集的行分成尽可能多的let分配进行调试,但是该CIImage构造函数发生了一些神秘的事情。有任何想法吗?


阅读 252

收藏
2020-07-07

共1个答案

一尘不染

问题是这一行:

imageView.image = UIImage(CIImage: (filter.outputImage)!)

你不能那样做。CIImage不会神奇地变成UIImage。图像视图需要基于 位图 的图像,而不是基于CIImage的图像。您必须 渲染
CIImage才能将其转换为UIImage,方法是获取CIContext并告诉它创建CGImage,或者将CIImage绘制到图形上下文中。

2020-07-07