Swift Cannot remove CIFIlter from UIImage

后端 未结 2 937
情深已故
情深已故 2020-12-12 03:01

been working on swift for a bit now and having trouble tackling this Core Image Framework. I was able to successfully create a CIFilter over an image however I\'m not sure

2条回答
  •  无人及你
    2020-12-12 03:19

    You can do this by keeping previous value in a variable or if you have multiple filters keep that values in a dictionary. When you are applying a new filter or changing value of existing filter, just replace that value with new value and apply all values on original CIImage

    For example,

        var allFilters = [String: [String: Any]]()
        var currentImage: CIImage!
        let kCIColorControls = "CIColorControls"
    
        override func viewDidLoad() {
            super.viewDidLoad()
            currentImage = CIImage(image: self.originalImage!)
        }
    
        func applyAvailableFilters() {
                if self.allFilters.count > 0 {            
                    DispatchQueue.global(qos: .background).async {
                        var outputImage: CIImage!
    
                        self.blurFilter = CIFilter.init(name: "CIGaussianBlur")
                        self.brightnessFilter = CIFilter.init(name: "CIColorControls")
                        self.cropFilter = CIFilter.init(name: "CICrop")
    
                        if let blurProperty = self.allFilters[self.kCIGaussianBlur]?.first {
                            self.blurFilter.setValue(blurProperty.value, forKey: blurProperty.key)
                                                    self.blurFilter.setValue(self.currentImage, forKey: kCIInputImageKey)
                            outputImage = self.blurFilter.outputImage
                        }
    
                        if let brightnessProperty = self.allFilters[self.kCIColorControls]?.first {
                            self.brightnessFilter.setValue(brightnessProperty.value, forKey: brightnessProperty.key)
                            if let outputImage = self.blurFilter.outputImage {
                                self.brightnessFilter.setValue(outputImage, forKey: kCIInputImageKey)
                            } else {
                                self.brightnessFilter.setValue(self.currentImage, forKey: kCIInputImageKey)
                            }
                            outputImage = self.brightnessFilter.outputImage
                        }
    
                        if let cropProperty = self.allFilters[self.kCICrop]?.first {
                            self.cropFilter.setValue(cropProperty.value, forKey: cropProperty.key)
                            if let outputImage = self.brightnessFilter.outputImage {
                                self.cropFilter.setValue(outputImage, forKey: kCIInputImageKey)
                            } else if let outputImage = self.blurFilter.outputImage {
                                self.cropFilter.setValue(outputImage, forKey: kCIInputImageKey)
                            } else {
                                self.cropFilter.setValue(self.currentImage, forKey: kCIInputImageKey)
                            }
                            outputImage = self.cropFilter.outputImage
                        }
    
                        if let image = outputImage {
                            let openGLContext = EAGLContext(api: .openGLES2)
                            let context = CIContext(eaglContext: openGLContext!)
                            if let cgimg = context.createCGImage(image, from: image.extent) {
                                let processedImage = UIImage(cgImage: cgimg)
                                DispatchQueue.main.async {
                                    self.imageView.image = processedImage
                                }
                            }
                        } else {
                            DispatchQueue.main.async {
                                self.imageView.image = self.selectedImage
                            }
                        }
                    }
                } else {
                    DispatchQueue.main.async {
                        self.imageView.image = self.selectedImage
                    }
                }
            }
    

    Then apply your filter like this (Blur filter)

    @IBAction func sliderValueChanged(_ sender: UISlider) {
          if sender.value == 0 {
                _ = allFilters.removeValue(forKey: kCIGaussianBlur)
            } else {
                allFilters[kCIGaussianBlur] = [kCIInputRadiusKey: sender.value]
            }
            if allFilters[kCICrop]?.first == nil {
                allFilters[kCICrop] = ["inputRectangle": CIVector(cgRect: self.currentImage.extent)]
            }
            applyAvailableFilters()
    }
    

提交回复
热议问题