Почему я не могу вернуть свое изображение к исходному с помощью CIFilter в моем приложении Swift для iOS

Я работаю над простым приложением. Он имеет вид изображения с предварительно загруженным изображением и кнопкой. При нажатии на кнопку изображение должно инвертироваться в режиме просмотра изображений.

Он работает в первый раз, но я ожидаю, что он вернет изображение в исходную форму, когда я снова нажму кнопку. Однако он вылетает при втором нажатии кнопки.

Вот соответствующий код от ViewController.swift:

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var invertButton: UIButton!

    @IBAction func invertButtonPressed(sender: UIButton) {
        let beginImage = CIImage(image: imageView.image!)
        let filter = CIFilter(name: "CIColorInvert")!
        filter.setValue(beginImage, forKey: kCIInputImageKey)
        imageView.image = UIImage(CIImage: (filter.outputImage)!)
    }

По сути, beginImage становится nil во второй раз, и я понятия не имею, почему. Я пробовал выполнять отладку, разбивая эти плотные строки на максимальное количество let назначений, но что-то таинственным образом происходит с этим CIImage конструктором. Любые идеи?


person R u c k s a c k    schedule 30.09.2015    source источник


Ответы (1)


Проблема в этой строке:

imageView.image = UIImage(CIImage: (filter.outputImage)!)

Вы не можете этого сделать. CIImage не превращается волшебным образом в UIImage. Представлению изображения требуется изображение на основе растрового изображения, а не изображение на основе CIImage. Вы должны рендерить CIImage, чтобы превратить его в UIImage, либо получив CIContext и сказав ему создать CGImage, либо отрисовав CIImage в графическом контексте.

person matt    schedule 30.09.2015
comment
И посмотрите мой пример кода здесь: github .com/mattneub/Programming-iOS-Book-Examples/blob/master/ Обратите внимание, что в конце есть три случая; вы хотите использовать метод случая 1 или метод случая 2. Техника случая 3 не работает, и именно ее вы используете. - person matt; 30.09.2015