2014-09-22 12 views
14

Proszę, pomóż zrozumieć, co jest nie tak. Próbowałem zarówno Xcode 6.0.1 i Xcode 6.1 beta 2. Mam proste rozszerzenie."CIImage to typ niezadeklarowany" dziwny błąd

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

Ale kompilator mówi "Używanie niezadeklarowanego typu" CIImage "". Co do cholery? Próbowałem zaimportować CoreImage, ale nic się nie zmieniło

+0

Widzimy ten sam problem z CGImage i CIImage. Zdarza się w wersji beta Xcode 6.2, ale nie Xcode 6.1. Tylko w rozszerzeniach UIImage. Gdzie indziej dobrze się buduje. Czy istnieje możliwość dołączenia linku do radaru? –

+1

Nadal problem w Xcode 7.1. – jowie

Odpowiedz

16

Zastosowanie CoreImage.CIImage zamiast CIImage do dwuznaczności.

7

Wydaje się być błędem w Xcode, typefasting Przerywa tylko wewnątrz bloku rozszerzeń, Możesz uzyskać bezpośredni dostęp do obrazu wyjściowego za pomocą właściwości "outputImage", która jest typu CIImage. Nie ma potrzeby korzystania valueForKey, spróbuj poniżej kod

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

************************ Aktualizacja ****** *****************

Myślę, że w twoim przypadku ciImage własnością UIImage instancji jest nil, to dlaczego jej upaść. Zauważ, że UIImage nie jest w rzeczywistości CIImage. Innymi słowy, UIImage 's CIImage nie jest zerowa tylko wtedy, gdy UIImage jest już poparte przez CIImage (np. Ponieważ zostało wygenerowane przez imageWithCIImage :). Nie możesz użyć tego, aby magicznie zamienić UIImage w CIImage, jak się wydaje masz nadzieję, że to zrobisz.

Więc trzeba zainicjować obraz z instancji CIImage, spróbuj tak aby pozbyć katastrofie

let image = UIImage(named: "test") 

    let ciImage = CIImage(image: image) 

    let imageWithCIImage = UIImage(CIImage: ciImage) 

    imageWithCIImage.saturate(toLevel: 0.5) 
+0

Próbowałem, ale zawsze otrzymuję "błąd krytyczny: nieoczekiwanie znaleziono zero podczas rozpakowywania wartości opcjonalnej" na linii let render Image = saturationFilter.outputImage –

+0

@VitaliyVashchenko wydaje CiImage jest zerowe, spróbuj zaktualizowanej odpowiedzi. –

+0

Tak więc nie ma jeszcze sposobu uruchomienia tego kodu. Ponieważ aby utworzyć CCImage, muszę użyć tej nazwy klasy. Ale to również powoduje powyższy błąd. –

17

W celu uniknięcia błędów można zdefiniować typ aliasu.

typealias MYImage = CIImage 

Następnie zadeklarować CIImage wejścia w swojej kategorii jak:

let inputImage = MYImage(image: self) 
+2

To trwa godzinę mojego życia. Dzięki. –

+3

Lub 'typalias CIImage = CoreImage.CIImage' wewnątrz metody wymagającej' CIImage'. –