如何将滤镜应用于一张图片?



我是 Swift 的初学者,并制作了一个应用程序"照片编辑器"。我有一个问题。我需要对一张图像应用一些过滤器。我有四个滑块(棕褐色,对比度,亮度,饱和度(和一个图像。我想将所有这些过滤器应用于我的图像。

我尝试更改代码中的逻辑,但我有同样的问题

@objc func sliderValueDidChange(sender: UISlider!) 
if sender.tag == 0 {
let originalCIImage = CIImage(image: self.image!)
let value = sender.value
self.sepiaLabelValue.text = String(Int(value*100))
if  let sepiaCIImage = sepiaFilter(originalCIImage!, intensity: Double(value)) {
filteredImage = sepiaCIImage
self.imageView.image = UIImage(ciImage: sepiaCIImage)
}
} else if sender.tag == 1 {
let originalCIImage = CIImage(image: self.image!)
let value = sender.value
self.brightnessValue.text = String(Int(value*100))
if let brightnessCIImage = brightnessFilter(originalCIImage!, intensity: Double(value)) {
filteredImage = brightnessCIImage
self.imageView.image = UIImage(ciImage:brightnessCIImage)
}
} else if sender.tag == 2 {
let originalCIImage = CIImage(image: self.image!)
let value = sender.value
self.contrastLabel.text = String(Int(value*100))
let contrastCIImage = contrastFilter(originalCIImage!, intensity: Double(value))
self.imageView.image = UIImage(ciImage:contrastCIImage!)
} else if sender.tag == 3 {
let originalCIImage = CIImage(image: self.image!)
let value = sender.value
self.saturationValue.text = String(Int(value*100))
let saturationCIImage = saturationFilter(originalCIImage!, intensity: Double(value))
self.imageView.image = UIImage(ciImage:saturationCIImage!)
}
}

func sepiaFilter(_ input: CIImage, intensity: Double) -> CIImage?
{
let sepiaFilter = CIFilter(name:"CISepiaTone")
sepiaFilter?.setValue(input, forKey: kCIInputImageKey)
sepiaFilter?.setValue(intensity, forKey: kCIInputIntensityKey)
return sepiaFilter?.outputImage
}
func brightnessFilter(_ input: CIImage, intensity: Double) -> CIImage? {
let brightnessFilter = CIFilter(name: "CIColorControls")
brightnessFilter?.setValue(input, forKey: kCIInputImageKey)
brightnessFilter?.setValue(intensity, forKey: kCIInputBrightnessKey)
return brightnessFilter?.outputImage
}
func contrastFilter(_ input: CIImage, intensity: Double) -> CIImage? {
let contrastFilter = CIFilter(name: "CIColorControls")
contrastFilter?.setValue(input, forKey: kCIInputImageKey)
contrastFilter?.setValue(intensity, forKey: kCIInputContrastKey)
return contrastFilter?.outputImage
}
func saturationFilter(_ input: CIImage, intensity: Double) -> CIImage? {
let saturationFilter = CIFilter(name: "CIColorControls")
saturationFilter?.setValue(input, forKey: kCIInputImageKey)
saturationFilter?.setValue(intensity, forKey: kCIInputSaturationKey)
return saturationFilter?.outputImage
}

当我应用第一个过滤器然后应用下一个过滤器时,第一个过滤器的值被建立为开始状态。如何将所有滤镜应用于我的图像?

正如Gigi所说,诀窍是在值更改时始终将两个过滤器应用于图像。这应该可以解决问题:

let colorControlsFilter = CIFilter(name: "CIColorControls")!
let sepiaFilter = CIFilter(name:"CISepiaTone")!

@objc func sliderValueDidChange(sender: UISlider!) {
switch sender.tag {
case 0: 
let value = sender.value
self.sepiaLabelValue.text = String(Int(value*100))
self.sepiaFilter.setValue(value, forKey: kCIInputIntensityKey)
case 1:
let value = sender.value
self.brightnessValue.text = String(Int(value*100))
self.colorControlsFilter.setValue(value, forKey: kCIInputBrightnessKey)
case 2:
let value = sender.value
self.contrastLabel.text = String(Int(value*100))
self.colorControlsFilter.setValue(value, forKey: kCIInputContrastKey)
case 3:
let value = sender.value
self.saturationValue.text = String(Int(value*100))
self.colorControlsFilter.setValue(value, forKey: kCIInputSaturationKey)
default: pass
}
self.updateImage()
}
func updateImage() {
let originalCIImage = CIImage(image: self.image!)
// first apply color controls (contrast, brightness, saturation), then sepia
self.colorControlsFilter.setValue(originalCIImage, forKey: kCIInputImageKey)
self.sepiaFilter.setValue(self.colorControlsFilter.outputImage, forKey: kCIInputImageKey)
self.imageView.image = UIImage(ciImage: self.sepiaFilter.outputImage!)
} 
let context = CIContext(options: nil)      
if let currentFilter = CIFilter(name: "CISepiaTone") {
let beginImage = CIImage(image: image!)
currentFilter.setValue(beginImage, forKey: kCIInputImageKey)


if let output = currentFilter.outputImage {
if let cgimg = context.createCGImage(output, from: output.extent) {
filteredImage = UIImage(cgImage: cgimg)
}
}
}

最新更新