2015-02-07 8 views
7

मैं मूल छवि का उपयोग कर रहा हूं और मैं अपनी छवि में एक सीआईफ़िल्टर सेपिया टोन लगा रहा हूं। मैं दृश्य में एक बार फ़िल्टर चलाता हूं और फिर तुरंत एक और फ़ंक्शन कॉल करता हूं जो फ़िल्टर को फिर से जोड़ता है। किसी कारण से, जब मैं आउटपुट छवि तक पहुंचने का प्रयास करता हूं, तो ऐप क्रैश हो जाता है और कहता है कि आउटपुट छवि शून्य है। क्या कोई जानता है कि यह क्यों हो रहा है?सीआईफ़िल्टर आउटपुट छवि शून्य

धन्यवाद

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



} 

उत्तर

10

आप UIImage(CIImage:) कॉल नहीं कर सकते हैं और उसका उपयोग UIImage एक UIImageView की छवि के रूप में। UIImageView को एक बिटमैप (CGImage) द्वारा समर्थित UIImage की आवश्यकता होती है। सीआईएममेज के साथ तत्काल एक यूआईएममेज में कोई बिटमैप नहीं है; इसमें कोई वास्तविक छवि नहीं है, यह केवल फ़िल्टर लगाने के लिए निर्देशों का एक सेट है। यही कारण है कि आपकी UIImageView की छवि शून्य है।

+0

पर कोड पोस्ट किया गया है और मेरी पुस्तक को CIImage से _real_ छवि निकालने के तरीके पर देखें: http://www.apeth.com /iOSBook/ch15.html#_cifilter_and_ciimage – matt

+1

और स्विफ्ट कोड के लिए: https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch02p070filters/ch15p419filters/ViewController.swift – matt

+1

मुझे लगता है कि समाधान उल्लिखित है http://stackoverflow.com/users/1955870/fz द्वारा काम करता है ('CIContext' का उपयोग करके)। क्या कोई जोखिम है? – SwiftArchitect

7

योग्य कुछ बातें यहाँ:

1) एक गैर CIImage के आधार पर एक CIImage बनाने के लिए CIImage निर्माता का उपयोग करना समर्थित UIImage खतरनाक है और शून्य या एक खाली CIImage वापस आ जाएगी।

2) छवि को वापस बनाते समय मैं आपको UIImage (CIImage :) के बजाय CIContext का उपयोग करने का सुझाव देता हूं।

उदाहरण:

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

बढ़िया! मेड एक 'IBInspectable UIImageView' है और https://gist.github.com/SwiftArchitect/676007e8e1c77e632520 – SwiftArchitect

संबंधित मुद्दे