首页 > 解决方案 > 如何将过滤器应用于照片库中的选定图像,而不仅仅是硬编码的图像

问题描述

我正在开发一个照片应用程序,用户可以在其中从照片库中的图像中进行选择,或者他们可以使用相机从应用程序内部拍摄照片。

我有从任一来源获取图像的功能。如果过滤器是用图像名称硬编码的,我可以将过滤器应用于图像,但不能在选择或拍摄它们时应用。

我将如何进行更改,这样我就不需要将图像的名称硬编码到用于将过滤器应用于图像的部分中?

这是我到目前为止关于主题方式的代码。

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    var FilterName:String?

    @IBAction func filters(_ sender: UIButton) {
        switch sender.tag {
        case 1: FilterName = "CIGaussianBlur"
        case 2: FilterName = "CIMedianFilter"
        case 3: FilterName = "CIEdges"
        default: print("No Filter Applied")
        }
        process()
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        guard let image = info[.originalImage] as? UIImage
        else
        {
            return
        }
        PhotoView.image = image
        dismiss(animated: true, completion: nil)
    }

    func process() {
        if let image = UIImage("test")
        {
            let originalImage = CIImage(image: image)
            let filter = CIFilter(name: FilterName!)
            filter?.setDefaults()
            filter?.setValue(originalImage, forKey: kCIInputImageKey)
            if let outputImage = filter?.outputImage {
                let newImage = UIImage(ciImage: outputImage)
                PhotoView.image = newImage
            }
        }
    }
}

标签: iosswift

解决方案


由于您似乎想要选择一个图像,然后让用户点击几个过滤器按钮之一,因此您需要将所选图像从图像选择器保存到UIImage类中的属性中。

然后更新您的process方法以使用该属性而不是加载硬编码图像。

将以下属性添加到您的类中:

var selectedImage: UIImage? = nil

然后更新您的图像选择器委托方法以设置此属性:

selectedImage = info[.originalImage] as? UIImage

然后更新您的process方法以使用该属性而不是加载硬编码图像:

if let image = selectedImage {

推荐阅读