【问题标题】:'CIImage is undeclared type' strange error'CIImage 是未声明的类型' 奇怪的错误
【发布时间】:2014-09-22 05:25:48
【问题描述】:

请帮助了解这里出了什么问题。我已经尝试过 Xcode 6.0.1 和 Xcode 6.1 beta 2。我有一个简单的扩展。

extension UIImage {
    func saturate (toLevel level : Float) -> UIImage {
        // create filter
        let saturationFilter = CIFilter(name: "CIColorControls")
        saturationFilter.setValue(self.CIImage, forKey: kCIInputImageKey)
        saturationFilter.setValue(NSNumber.numberWithFloat(level), forKey: "inputSaturation")

        // create context
        let context = CIContext(options: nil)

        // render image with filter
ERROR:  let renderedImage = saturationFilter.valueForKey(kCIOutputImageKey) as CIImage
        let imageRef = context.createCGImage(renderedImage, fromRect: renderedImage.extent())

        return UIImage(CGImage: imageRef)
    }
}

但是编译器说“使用未声明的类型'CIImage'”。我勒个去?我尝试导入 CoreImage,但没有任何改变

【问题讨论】:

  • 看到 CGImage 和 CIImage 的相同问题。发生在 Xcode 6.2 beta 但不是 Xcode 6.1。仅在 UIImage 扩展中。其他地方构建良好。有没有可能包含雷达的链接?
  • 在 Xcode 7.1 中仍然是一个问题。

标签: ios xcode swift


【解决方案1】:

使用CoreImage.CIImage 而不是CIImage 来消除歧义。

【讨论】:

    【解决方案2】:

    为了避免该错误,您可以定义类型别名。

    typealias MYImage = CIImage
    

    然后将您的类别中的输入 CIImage 声明为:

    let inputImage = MYImage(image: self)
    

    【讨论】:

    • 我的生命已经过去了一个小时。谢谢。
    • 或者typealias CIImage = CoreImage.CIImage在需要CIImage的方法里面。
    【解决方案3】:

    似乎是 Xcode 中的错误,类型转换仅在扩展块内失败,您可以使用 CIImage 类型的属性“outputImage”直接访问输出图像。不用valueForKey,试试下面的代码

     extension UIImage {
            func saturate (toLevel level : Float) -> UIImage {
                // create filter
                let saturationFilter = CIFilter(name: "CIColorControls")
                saturationFilter.setValue(self.CIImage, forKey: kCIInputImageKey)
                saturationFilter.setValue(NSNumber.numberWithFloat(level), forKey: "inputSaturation")
    
                // create context
                let context = CIContext(options: nil)
    
                // render image with filter
            let renderedImage = saturationFilter.outputImage
             let imageRef = context.createCGImage(renderedImage, fromRect: renderedImage.extent())
    
                return UIImage(CGImage: imageRef)
            }
        }
    

    ************************ 更新 ************ ***********

    我认为在你的情况下,UIImage 实例的 ciImage 属性是 nil ,这就是它崩溃的原因。请注意,UIImage 实际上不是CIImage。换句话说,UIImageCIImage 不是 nil 仅当 UIImage 已经由 CIImage 支持时(例如,因为它是由 imageWithCIImage 生成的:)。您不能像您希望的那样使用它神奇地将UIImage 变成CIImage

    所以你需要用 CIImage 实例初始化图像,试试这样摆脱崩溃

        let image = UIImage(named: "test")
    
        let ciImage = CIImage(image: image)
    
        let imageWithCIImage = UIImage(CIImage: ciImage)
    
        imageWithCIImage.saturate(toLevel: 0.5)
    

    【讨论】:

    • 我试过了,但我总是得到“致命错误:在展开可选值时意外发现 nil”在 let renderImage = saturationFilter.outputImage 行
    • @VitaliyVashchenko 似乎 ciImage 为 nil ,尝试更新答案。
    • 所以,还没有办法运行这段代码。因为要创建 CCImage 我必须使用这个类名。但这也会产生上述错误。
    • @VitaliyVashchenko 在扩展外使用 CIImage(image: image)。
    • 是的,我做到了。谢谢。我的意思是这不是一个好的代码。向 Apple 提交了错误报告,因此他们修复了这个丑陋的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    相关资源
    最近更新 更多