2015-02-07 19 views
7

Tôi đang sử dụng hình ảnh lõi và tôi đang áp dụng tông màu nâu đỏ CIFilter cho hình ảnh của tôi. Tôi chạy một bộ lọc một lần trong viewDidLoad và sau đó ngay lập tức gọi một hàm khác để thêm bộ lọc một lần nữa. Vì lý do nào đó, khi tôi cố gắng truy cập vào hình ảnh đầu ra, ứng dụng bị treo và cho biết hình ảnh đầu ra là không. Có ai biết tại sao chuyện này xảy ra không?Hình ảnh đầu ra CIFilter nil

Cảm ơn

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



} 

Trả lời

10

Bạn không thể gọi UIImage(CIImage:) và sử dụng rằng UIImage như hình ảnh của một UIImageView. UIImageView yêu cầu một UIImage được hỗ trợ bởi một bitmap (CGImage). Một UIImage được khởi tạo với CIImage không có bitmap; nó không có hình ảnh thực tế, nó chỉ là một tập hợp các hướng dẫn để áp dụng một bộ lọc. Đó là lý do tại sao hình ảnh của UIImageView của bạn là không.

+0

Và xem sách của tôi về cách trích xuất hình ảnh _real_ từ CIImage: http://www.apeth.com /iOSBook/ch15.html#_cifilter_and_ciimage – matt

+1

Và đối với mã Swift: https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch02p070filters/ch15p419filters/ViewController.swift – matt

+1

Tôi thấy rằng giải pháp được nêu bởi http://stackoverflow.com/users/1955870/fz không hoạt động (sử dụng 'CIContext'). Có rủi ro liên quan không? – SwiftArchitect

7

Một vài điều ở đây:

1) Sử dụng các nhà xây dựng CIImage để tạo ra một CIImage dựa trên một tổ chức phi CIImage hậu thuẫn UIImage là nguy hiểm và sẽ trở lại con số không hoặc một CIImage trống.

2) Khi tạo lại hình ảnh, tôi khuyên bạn nên sử dụng CIContext thay vì UIImage (CIImage :).

Ví dụ:

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

Tuyệt vời! Được tạo thành là 'UIImageView' IBInspectable và đăng mã trên https://gist.github.com/SwiftArchitect/676007e8e1c77e632520 – SwiftArchitect

Các vấn đề liên quan