'CIImage是未声明类型'的奇怪错误

Vit*_*nko 15 xcode ios swift

请帮助理解这里的错误.我已经尝试了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)
    }
}
Run Code Online (Sandbox Code Playgroud)

但编译器说"使用未声明的类型'CIImage'".我勒个去?我试图导入CoreImage,但没有任何改变

Ion*_*Ion 17

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

typealias MYImage = CIImage
Run Code Online (Sandbox Code Playgroud)

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

let inputImage = MYImage(image: self)
Run Code Online (Sandbox Code Playgroud)

  • 或者在需要`CIImage`的方法中的`typealias CIImage = CoreImage.CIImage`. (3认同)
  • 我生命中有一个小时.谢谢. (2认同)

Rud*_*vič 16

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


Yat*_*B L 7

似乎是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)
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

我认为在你的情况下ciImage,UIImage实例的属性是nil,这就是它崩溃的原因.请注意,UIImage事实上并非如此CIImage.换句话说,只有在已经支持的情况下(例如因为它是由imageWithCIImage :)生成的,UIImages CIImage才不是零.正如你似乎希望的那样,你无法用它来神奇地变成一个.UIImageCIImageUIImageCIImage

因此,您需要使用CIImage实例初始化图像,尝试这样来摆脱崩溃

    let image = UIImage(named: "test")

    let ciImage = CIImage(image: image)

    let imageWithCIImage = UIImage(CIImage: ciImage)

    imageWithCIImage.saturate(toLevel: 0.5)
Run Code Online (Sandbox Code Playgroud)