2015-02-07 17 views
7

Używam obrazu rdzenia i stosuję sepię CIFilter na moim obrazie. Uruchamiam filtr raz w viewDidLoad, a następnie natychmiast wywołuje inną funkcję, która dodaje filtr ponownie. Z jakiegoś powodu, gdy próbuję uzyskać dostęp do obrazu wyjściowego, aplikacja ulega awarii i mówi, że obraz wyjściowy jest zerowy. Czy ktoś wie, dlaczego tak się dzieje?Obraz wyjściowy CIFilter zero

Dzięki

import UIKit 

class ViewController: UIViewController { 
    @IBOutlet weak var myimage: UIImageView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     let image = CIImage(image: myimage.image) 
     let filter = CIFilter(name: "CISepiaTone") 
     filter.setDefaults() 
     filter.setValue(image, forKey: kCIInputImageKey) 
     myimage.image = UIImage(CIImage: filter.outputImage) 
     self.reapplyFilter() 
    } 

     func reapplyFilter(){ 
      let image = CIImage(image: myimage.image) 
      let filter = CIFilter(name: "CISepiaTone") 
      filter.setDefaults() 
      filter.setVa lue(image, forKey: kCIInputImageKey) 
    //ERROR HERE: fatal error: unexpectedly found nil while unwrapping an Optional value 
      myimage.image = UIImage(CIImage: filter.outputImage) 
//ERROR 
     } 

     override func didReceiveMemoryWarning() { 
      super.didReceiveMemoryWarning() 
      // Dispose of any resources that can be recreated. 
     } 



} 

Odpowiedz

10

nie można nazwać UIImage(CIImage:) i użyć UIImage jako obrazu UIImageView. UIImageView wymaga UIImage wspieranego przez bitmapę (CGImage). Obiekt UIImage utworzony za pomocą CIImage nie ma bitmapy; nie ma rzeczywistego obrazu, to tylko zestaw instrukcji dotyczących stosowania filtra. Dlatego obraz waszego UIImageView jest zerowy.

+0

Zobacz też moją książkę o wyodrębnianiu _real_ obrazu z CIImage: http://www.apeth.com /iOSBook/ch15.html#_cifilter_and_ciimage – matt

+1

A dla kodu Swift: https://github.com/mattneub/Programowanie-iOS-Book-Examples/blob/master/bk2ch02p070filters/ch15p419filters/ViewController.swift – matt

+1

Uważam, że opisane rozwiązanie przez http://stackoverflow.com/users/1955870/fz działa (używając 'CIContext'). Czy istnieje powiązane ryzyko? – SwiftArchitect

7

Kilka rzeczy tutaj:

1) Korzystanie z konstruktora CIImage stworzyć CIImage opartego na braku CIImage backed UIImage jest niebezpieczne i zwróci nil lub pusty CIImage.

2) Podczas tworzenia obrazu z powrotem sugeruję użycie CIContext zamiast UIImage (CIImage :).

Przykład:

class ViewController: UIViewController { 
    @IBOutlet weak var myimage: UIImageView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     myimage.backgroundColor = UIColor.redColor() 

     self.applyFilter() 
     self.applyFilter() 
    } 

    func applyFilter(){ 
     let image = CIImage(CGImage: myimage.image?.CGImage) 
     let filter = CIFilter(name: "CISepiaTone") 
     filter.setDefaults() 
     filter.setValue(image, forKey: kCIInputImageKey) 

     let context = CIContext(options: nil) 
     let imageRef = context.createCGImage(filter.outputImage, fromRect: image.extent()) 
     myimage.image = UIImage(CGImage: imageRef) 
    } 
} 
+0

Świetnie! Wykonano "IBInspectable UIImageView" i opublikowałem kod na https://gist.github.com/SwiftArchitect/676007e8e1c77e632520 – SwiftArchitect