2014-09-22 62 views
14

请帮助理解这里有什么问题。我已经尝试了Xcode 6.0.1和Xcode 6.1 beta 2.我有一个简单的扩展。'CIImage is undeclared type'strange error

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,但没有任何更改

+0

看到与CGImage和CIImage相同的问题。在Xcode 6.2测试版中发生,但不在Xcode 6.1中发生。仅在UIImage扩展中。其他地方的建设很好。你有没有可能把这个链接加入雷达? – 2014-12-03 11:22:24

+1

仍然是Xcode 7.1中的一个问题。 – jowie 2015-11-30 15:45:03

回答

16

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

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) 
     } 
    } 

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

我觉得你的情况ciImage属性UIImage实例是nil,这就是为什么它崩溃。请注意,UIImage其实不是CIImage。换句话说,UIImageCIImage只有在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) 
+0

我试过,但我总是得到“致命的错误:意外地发现零,同时解开一个可选值”上let renderedImage = saturationFilter.outputImage行 – 2014-09-22 08:14:31

+0

@VitaliyVashchenko似乎ciImage是零,尝试更新的答案。 – 2014-09-22 08:45:50

+0

所以,还没有办法运行这个代码。因为要创建CCImage,我必须使用这个类名。但是这也会产生上述错误。 – 2014-09-22 08:49:12

17

的为了避免你可以定义一个类型别名的bug。

typealias MYImage = CIImage 

然后在你的类声明输入CIImage为:

let inputImage = MYImage(image: self) 
+2

我的生活有一个小时。谢谢。 – 2015-09-24 20:08:03

+3

或'typealias CIImage = CoreImage.CIImage'在需要'CIImage'的方法内。 – 2015-10-30 11:37:17

相关问题