Ответ 1
Используйте CoreImage.CIImage
вместо CIImage
для устранения неоднозначности.
Пожалуйста, помогите понять, что здесь не так. Я пробовал как 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, но ничего не изменилось
Используйте CoreImage.CIImage
вместо CIImage
для устранения неоднозначности.
Чтобы избежать ошибки, вы можете определить псевдоним типа.
typealias MYImage = CIImage
Затем объявите ввод CIImage в своей категории как:
let inputImage = MYImage(image: self)
Кажется, это ошибка в Xcode, typecasting Fails только внутри блока расширения. Вы можете напрямую обращаться к выходному изображению, используя свойство 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
на самом деле не a ciImage
. Другими словами, UIImage
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)