为什么我不能在我的 Swift iOS 应用程序中使用 CIFilter 将我的图像反转回原始图像

Why can't I invert my image back to original with CIFilter in my Swift iOS app

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

它第一次工作,但我希望它能在我再次按下按钮时将图像反转回原来的形式。 然而,它在第二次按下按钮时崩溃了。

这里是来自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 构造函数神秘地发生了一些事情。有什么想法吗?

问题出在这一行:

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

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