请帮助理解这里的错误。我已经尝试过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,但没有改变
答案 0 :(得分:17)
为了避免该错误,您可以定义类型别名。
typealias MYImage = CIImage
然后在您的类别中声明输入CIImage:
let inputImage = MYImage(image: self)
答案 1 :(得分:16)
使用CoreImage.CIImage
代替CIImage
消除歧义。
答案 2 :(得分:7)
似乎是Xcode中的错误,类型转换仅在扩展块内部失败,您可以使用属性" outputImage'直接访问输出图像。这是CIImage类型。无需使用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
。换句话说,UIImage
' s CIImage
仅在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)