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

Posted

技术标签:

【中文标题】为啥我不能在我的 Swift iOS 应用程序中使用 CIFilter 将我的图像反转回原始图像【英文标题】:Why can't I invert my image back to original with CIFilter in my Swift iOS app为什么我不能在我的 Swift iOS 应用程序中使用 CIFilter 将我的图像反转回原始图像 【发布时间】:2015-12-28 18:31:29 【问题描述】:

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

它第一次工作,但我希望当我再次按下按钮时它会将图像反转回其原始形式。 但是,它在第​​二次按下按钮时崩溃。

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

【问题讨论】:

【参考方案1】:

问题出在这一行:

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

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

【讨论】:

并在此处查看我的示例代码:github.com/mattneub/Programming-ios-Book-Examples/blob/master/… 注意最后有三种情况;您想使用案例 1 技术或案例 2 技术。案例 3 技术不起作用 - 这就是您正在使用的技术。

以上是关于为啥我不能在我的 Swift iOS 应用程序中使用 CIFilter 将我的图像反转回原始图像的主要内容,如果未能解决你的问题,请参考以下文章

Swift:为啥我的 iOS 不能扫描其他蓝牙设备

如何在 Swift iOS 中使 web 视图不可点击

iOS+Swift:为啥音乐不能在 iPad 上播放?

Swift - 为啥 Process.arguments 返回空数组

为啥我在我的 Swift 文件中解包 nil?

为啥我的代码可以在 Xcode Playground 中运行,但不能在我的项目中运行?