2014-09-22 15 views
14

Per favore, aiuta a capire cosa c'è che non va. Ho provato sia Xcode 6.0.1 che Xcode 6.1 beta 2. Ho un'estensione semplice.'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) 
    } 
} 

Ma il compilatore dice "Uso di tipo non dichiarato 'CIImage'". Che diavolo? Ho provato ad importare CoreImage, ma non è cambiato nulla

+0

Visualizzazione dello stesso problema con CGImage e CIImage. Accade in Xcode 6.2 beta ma non in Xcode 6.1. Solo nelle estensioni UIImage. Altrove va bene. Qualche possibilità che potresti includere il link al radar? –

+1

Ancora un problema in Xcode 7.1. – jowie

risposta

16

Uso CoreImage.CIImage invece di CIImage per disambiguare.

7

Sembra un bug in Xcode, un errore di tipizzazione non riesce solo all'interno del blocco di estensione, È possibile accedere direttamente all'immagine di output utilizzando la proprietà 'outputImage' che è di tipo CIImage. Non c'è bisogno di usare valueForKey, Prova sottostante Codice

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

************************ Aggiornamento ****** *****************

penso Nel tuo caso ciImage proprietà di UIImage istanza è nil, è per questo che il suo crash. Si noti che UIImage non è in realtà un CIImage. In altre parole, lo di non è nullo solo se lo UIImage è già supportato da CIImage (ad esempio perché è stato generato da imageWithCIImage :). Non è possibile utilizzarlo per trasformare magicamente lo UIImage in un CIImage, come si spera di fare.

quindi è necessario inizializzare immagine con un'istanza CIImage, Prova in questo modo per sbarazzarsi di incidente

let image = UIImage(named: "test") 

    let ciImage = CIImage(image: image) 

    let imageWithCIImage = UIImage(CIImage: ciImage) 

    imageWithCIImage.saturate(toLevel: 0.5) 
+0

Ho provato, ma ottengo sempre "errore fatale: inaspettatamente trovato nil mentre scartando un valore Opzionale" sul reso renderedImage = saturationFilter.outputImage line –

+0

@VitaliyVashchenko sembra ciImage è nullo, Prova la risposta aggiornata. –

+0

Quindi, non c'è ancora modo di eseguire questo codice. Perché per creare CCImage devo usare questo nome di classe. Ma questo produce anche l'errore di cui sopra. –

17

Al fine di evitare il bug è possibile definire un tipo di alias.

typealias MYImage = CIImage 

quindi dichiarare il CIImage di ingresso nella vostra categoria:

let inputImage = MYImage(image: self) 
+2

Ci passa un'ora della mia vita. Grazie. –

+3

Oppure 'typealias CIImage = CoreImage.CIImage' all'interno del metodo che richiede' CIImage'. –