Как сохранить экземпляр UIImage в var в iOS? - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть функция фильтра в ViewControlller.swift, которая фильтрует изображение photoImageView, которое также сохраняется в ViewControlller.swift. Проблема заключается в том, что цветной фильтр применяется к результату предыдущего отфильтрованного изображения вместо исходного изображения. Как я могу сохранить photoImageView в originalImage var для применения фильтра вместо этого?

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    //MARK: Properties
    @IBOutlet weak var photoImageView: UIImageView!

    @IBAction func slideFilter(_ sender: UISlider) {

        var hueFilter = Double(sender.value)
        hueFilter = hueFilter.rounded(toPlaces: 2)

        //create image to filter
        let inputImage = CIImage(image: photoImageView.image!)

        //Create a random color to apply
        let randomColor = [kCIInputAngleKey: hueFilter]

        //Apply filter to image
        let filteredImage = inputImage!.applyingFilter("CIHueAdjust", parameters: randomColor)     

        let renderImage = context.createCGImage(filteredImage, from: filteredImage.extent)

        // Reflect the change back in the interface
        photoImageView.image = UIImage(cgImage: renderImage!)
    }
}

Когда я пытаюсь сохранить экземпляр переменной photoImageView во ViewController, я получаю эту ошибку Cannot use instance member 'photoImageView' within property initializer; property initializers run before 'self' is available

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Я понял!

Вы просто создаете переменную inputImage вне любого метода в ViewController. Таким образом, любые методы могут вызывать его.

Установите значение для inputImage в viewDidLoad() (и в любом месте, где вы будете менять изображение). Таким образом, функция фильтра может получить доступ к изображению.

Конечный результат:

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    //MARK: Properties
    @IBOutlet weak var photoImageView: UIImageView!

    var inputImage:CIImage? 


    override func viewDidLoad() {
    super.viewDidLoad()
        inputImage = CIImage(image: photoImageView.image!)


    }


    @IBAction func slideFilter(_ sender: UISlider) {

        var hueFilter = Double(sender.value)
        hueFilter = hueFilter.rounded(toPlaces: 2)

        //Create a random color to apply
        let randomColor = [kCIInputAngleKey: hueFilter]

    //Apply filter to image
    let filteredImage = inputImage!.applyingFilter("CIHueAdjust", parameters: randomColor)     

    let renderImage = context.createCGImage(filteredImage, from: filteredImage.extent)

        // Reflect the change back in the interface
        photoImageView.image = UIImage(cgImage: renderImage!)
    }
}
0 голосов
/ 18 ноября 2018

Вы не можете сохранить экземпляр переменной photoImageView в ViewController. Однако вы можете сохранить экземпляр переменной photoImageView в методе, подобном viewDidLoad().

Просто используйте точку останова после строки:

let inputImage = CIImage(image: photoImageView.image!)

Посмотрите, каково значение inputImage. Вы хотите оперировать этим изображением?

Потому что, если inputImage неверно, конечный результат также будет неверным.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...