Ios 如何通过UISlider和Swift使用CiColorControl更改亮度、对比度和饱和度

Ios 如何通过UISlider和Swift使用CiColorControl更改亮度、对比度和饱和度,ios,swift,core-graphics,core-image,cifilter,Ios,Swift,Core Graphics,Core Image,Cifilter,我正在开发一个照片过滤器应用程序,正如你们所看到的,我添加了一个功能来调整对比度、亮度、饱和度和噪音。但问题是它们是独立工作的,这意味着当我调整亮度时,比如说,一旦我开始编辑对比度,它就会恢复到原始亮度 这里是一个预览,当我将亮度设置为最大值(图像变白),然后尝试调整其对比度时,滑块会更改原始图像的对比度 在这里,我能够捕捉到释放滑块并将其值放在原始图像上的瞬间,正如您所看到的,在演示中,我将饱和度设置为0,然后将相同的饱和图像的对比度更改为0 问题是,现在我只需单击滑块而不更改其值,它就

我正在开发一个照片过滤器应用程序,正如你们所看到的,我添加了一个功能来调整对比度、亮度、饱和度和噪音。但问题是它们是独立工作的,这意味着当我调整亮度时,比如说,一旦我开始编辑对比度,它就会恢复到原始亮度

这里是一个预览,当我将亮度设置为最大值(图像变白),然后尝试调整其对比度时,滑块会更改原始图像的对比度

在这里,我能够捕捉到释放滑块并将其值放在原始图像上的瞬间,正如您所看到的,在演示中,我将饱和度设置为0,然后将相同的饱和图像的对比度更改为0

问题是,现在我只需单击滑块而不更改其值,它就会将当前值加倍。例如,如果我将亮度设置为5,将饱和度设置为10,并决定在单击“亮度”时立即调整亮度,则亮度值将加倍,我不知道为什么。 这里有一个例子。我只是点击滑块,而不改变它的值

这是代码

  @objc func sliderValueDidChange(_ sender: UISlider!) {

    if sender.tag == 0 {

        let displayinPercentage: Int = Int((sender.value/200) * 10000)
        brightnessValueLabel.text = ("\(displayinPercentage)")
        selectedPictureImageView.image = originalImage
        let beginImage = CIImage(image: selectedPictureImageView.image!)
        self.filter = CIFilter(name: "CIColorControls")
        self.filter?.setValue(beginImage, forKey: kCIInputImageKey)
        self.filter.setValue(sender.value, forKey: kCIInputBrightnessKey)
        self.filteredImage = self.filter?.outputImage
        selectedPictureImageView.image = UIImage(cgImage: self.context.createCGImage(self.filteredImage!, from: (self.filteredImage?.extent)!)!)
        sliderValue = sender.value


    } else if sender.tag == 1 {

        let displayinPercentage: Int = Int((sender.value/200) * 10000)
        contrastValueLabel.text = ("\(displayinPercentage)")
        self.selectedPictureImageView.image = originalImage
        let beginImage = CIImage(image: self.selectedPictureImageView.image!)
        self.filter = CIFilter(name: "CIColorControls")
        self.filter?.setValue(beginImage, forKey: kCIInputImageKey)
        self.filter.setValue(sender.value, forKey: kCIInputContrastKey)
        self.filteredImage = self.filter?.outputImage
        self.selectedPictureImageView.image = UIImage(cgImage: self.context.createCGImage(self.filteredImage!, from: (self.filteredImage?.extent)!)!)
        sliderValue = sender.value

    } else if sender.tag == 2 {

        let displayinPercentage: Int = Int((sender.value/200) * 10000)
        saturationValueLabel.text = ("\(displayinPercentage)")
        self.selectedPictureImageView.image = originalImage
        let beginImage = CIImage(image: self.selectedPictureImageView.image!)
        self.filter = CIFilter(name: "CIColorControls")
        self.filter?.setValue(beginImage, forKey: kCIInputImageKey)
        self.filter.setValue(sender.value, forKey: kCIInputSaturationKey)
        self.filteredImage = self.filter?.outputImage
        self.selectedPictureImageView.image = UIImage(cgImage: self.context.createCGImage(self.filteredImage!, from: (self.filteredImage?.extent)!)!)
        sliderValue = sender.value

    } else if sender.tag == 3 {

        let displayinPercentage: Int = Int((sender.value/200) * 10000)
        sharpenValueLabel.text = ("\(displayinPercentage)")
        self.selectedPictureImageView.image = originalImage
        let beginImage = CIImage(image: self.selectedPictureImageView.image!)
        self.filter = CIFilter(name: "CIUnsharpMask")
        self.filter?.setValue(beginImage, forKey: kCIInputImageKey)
        self.filter.setValue(7, forKey: kCIInputRadiusKey)
        self.filter.setValue(sender.value, forKey: kCIInputIntensityKey)
        self.filteredImage = self.filter?.outputImage
        self.selectedPictureImageView.image = UIImage(cgImage: self.context.createCGImage(self.filteredImage!, from: (self.filteredImage?.extent)!)!)
        sliderValue = sender.value

    }
}

@objc func sliderValueDidEnd(_ sender: UISlider!) {

    if sender.tag == 0 {
        originalImage = selectedPictureImageView.image
        sender.value = sliderValue
        print("Unpressed button slider value is \(sender.value)")
    } else if sender.tag == 1 {
        originalImage = selectedPictureImageView.image
        sender.value = sliderValue
        print("Unpressed button slider value is \(sender.value)")
    } else if sender.tag == 2 {
        originalImage = selectedPictureImageView.image
        sender.value = sliderValue
        print("Unpressed button slider value is \(sender.value)")
    } else if sender.tag == 3 {
        originalImage = selectedPictureImageView.image
        sender.value = sliderValue
        print("Unpressed button slider value is \(sender.value)")
    }
}

我认为一切正常,我只是对过滤器的值做了错误的计算。

你的问题是,每次滑动滑块时,你都将过滤器应用到上一个过滤器的结果图像上,而不是应用到原始图像上。顺便说一句,如果在用户完成操作后创建一个CGImage,那么在滑动UISlider时,您可以使过滤器的响应速度更快。您的代码应该如下所示:

let displayinPercentage = Int((sender.value/200) * 10000)
brightnessValueLabel.text = String(displayinPercentage)
let beginImage = CIImage(image: originalImage)
filter.setValue(beginImage, forKey: kCIInputImageKey)
filter.setValue(sender.value, forKey: kCIInputBrightnessKey)
if let ciimage = filter.outputImage {
    filteredImage = ciimage
    selectedPictureImageView.image = UIImage(ciImage: filteredImage)
}

我想补充一点,在绝对必要之前不创建UIImage可以获得最佳性能。保留CIImage,使用GLKView或MTKView进行渲染,并仅在必要时转换为UIImage。