2015-02-07 7 views
7

Ich verwende Kernbild und ich verwende einen CIFilter Sepiaton zu meinem Bild. Ich führe einmal in viewDidLoad einen Filter aus und dann sofort eine andere Funktion, die den Filter erneut hinzufügt. Wenn ich versuche, auf das Ausgabebild zuzugreifen, stürzt die App aus irgendeinem Grund ab und sagt, dass das Ausgabebild null ist. Wer weiß, warum das passiert?CIFilter Ausgabebild Null

Dank

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



} 

Antwort

10

Sie können UIImage(CIImage:) nicht aufrufen und verwenden, die UIImage als das Bild eines UIImageView. UIImageView erfordert ein UIImage, das von einer Bitmap (CGImage) unterstützt wird. Ein mit CIImage instanziierter UIImage hat keine Bitmap; es hat kein tatsächliches Bild, es ist nur eine Reihe von Anweisungen zum Anwenden eines Filters. Das Bild von UIImageView ist deshalb null.

+0

Und siehe mein Buch, wie man ein _real_ Bild aus einem CImage extrahiert: http://www.apeth.com /iOSBook/ch15.html#_cifilter_and_ciimage – matt

+1

Und für Swift Code: https://github.com/matnteub/Programming-iOS-Book-Examples/blob/master/bk2ch02p070filters/ch15p419filters/ViewController.swift – matt

+1

Ich finde, dass die Lösung skizziert von http://stackoverflow.com/users/1955870/fz funktioniert (mit 'CIContext'). Besteht ein damit verbundenes Risiko? – SwiftArchitect

7

Ein paar Dinge hier:

1), um den CIImage Konstruktor Mit einem CIImage auf einem nicht CIImage Basis zu schaffen gesichert UIImage gefährlich ist und keine oder eine leere CIImage zurück.

2) Beim Erstellen des Bildes würde ich vorschlagen, dass Sie CIContext anstelle von UIImage verwenden (CIImage :).

Beispiel:

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

Großartig! Made ist ein 'IBInspectable UIImageView' und veröffentlicht den Code auf https://gist.github.com/SwiftArchitect/676007e8e1c77e632520 – SwiftArchitect

Verwandte Themen