2016-05-29 2 views
0

Я разрабатываю простой проект фильтра CoreImage в Swift. Я пытаюсь достичь такой функции, как возврат отфильтрованного изображения обратно к оригиналу. Я использую следующий код для фильтра SepiaTone, и я пытаюсь сбросить фильтр с помощью фильтра CIColorControls. Но я становлюсь фатальным crash.I интересно, есть ли другой способ сбросить изображение.Сброс фильтра CoreImage в Swift

 @IBOutlet weak var originalImage: UIImageView! 

     @IBAction func SepiaToneFilter(sender: AnyObject) { 
     let mySepiaFilter = CIFilter(name: "CISepiaTone") 
     mySepiaFilter!.setValue(CIImage(image: originalImage.image!), forKey: kCIInputImageKey) 
     let myOutputImage : CIImage = mySepiaFilter!.outputImage!    
     originalImage.image = UIImage(CIImage: myOutputImage) 
     } 

     @IBAction func ResetFilter(sender: AnyObject) { 

     let currentFilter = CIFilter(name: "CIColorControls") 
     let beginImage = CIImage(image: originalImage.image!) 
     currentFilter!.setValue(beginImage, forKey: kCIInputImageKey 
     let output = currentFilter!.outputImage 

     let cgimg = context.createCGImage(output!, fromRect: output!.extent) **//CreateWrappedSurface() failed for a dataprovider-backed CGImageRef.fatal error: unexpectedly found nil while unwrapping an Optional value 
    (lldb)** 

     let processedImage = UIImage(CGImage: cgimg) 
     originalImage.image = processedImage 
     } 

// Выбор образа процесса

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) { 
    originalImage.image = image 
    self.dismissViewControllerAnimated(true, completion: nil); 
} 

Я не уверен, как запустить выше функции внутри моего ResetFilter (UIButton).

Спасибо заранее:

ответ

1

Почему бы просто не держать ссылку на исходное изображение? Например:

@IBOutlet weak var originalImage: UIImageView! 
    var userImage?:UIImage 

    @IBAction func SepiaToneFilter(sender: AnyObject) { 
     let mySepiaFilter = CIFilter(name: "CISepiaTone") 
     if let image = self.userImage { 
      mySepiaFilter!.setValue(CIImage(image: image), forKey: kCIInputImageKey) 
      let myOutputImage : CIImage = mySepiaFilter!.outputImage!    
      originalImage.image = UIImage(CIImage: myOutputImage) 
     } 
    } 

    @IBAction func ResetFilter(sender: AnyObject) { 
     if let image = self.userImage { 
      self.originalImage.image = image 
     } 

    } 


    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) { 
      self.userImage = image 
      originalImage.image = image 
      self.dismissViewControllerAnimated(true, completion: nil); 
    } 
+0

Спасибо за код. Я считаю, что код, который вы опубликовали, уже запущен в моем подпроекте для целей тестирования. Я пытаюсь реализовать проект CIfilter в своем основном проекте, который я получаю из UIImagePickerViewController исходного изображения, которое захватывает изображение из библиотеки фотографий. я не уверен, как назначить изображение pickerView как оригинальное изображение, и я также обновил свой код. Посмотрите и дайте мне знать, что вы думаете. Извините, я плохо забыл упомянуть о PickerView. – Joe

+0

Я нашел аналогичный вопрос в следующей ссылке [link] (http://stackoverflow.com/questions/23789547/reset-button-to-original-image-from-filtered-image). Но у меня возникают проблемы с преобразованием код от Obj-c до Swift ... – Joe

+1

Я обновил свой ответ. Возможно, вы уже поняли это, но вы можете просто установить свойство как нечто вроде «userImage» и установить это, когда вы получите изображение из 'UIImagePickerController'. – beyowulf

Смежные вопросы