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
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()
}