代码之家  ›  专栏  ›  技术社区  ›  Tigran

如何通过带swift的uislider使用cicolorcontrol更改亮度、对比度和饱和度

  •  1
  • Tigran  · 技术社区  · 6 年前

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

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

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

    现在的问题是,当我单击滑块而不更改其值时,它将当前值翻倍。例如,如果我将亮度5和饱和度10放在一起,并决定在单击亮度后立即调整亮度,它的值将加倍,我不知道为什么。 下面是一个例子。我只是点击滑块而不改变它的值。

    这是密码

    @objc func slidervaluedidchange(u sender:uislider!){
    
    如果sender.tag==0{
    
    让DisplayInPercentage:int=int((sender.value/200)*10000)
    BrightnessValueLabel.Text=“(DisplayInPercentage)”)
    selectedPictureImageView.image=原始图像
    让beginimage=ciimage(image:selectedPictureImageView.image!)
    self.filter=cifilter(名称:“cicolorcontrols”)
    自我过滤器?.setvalue(beginimage,forkey:kciinputimagekey)
    self.filter.setvalue(sender.value,forkey:kciinputBrightnessKey)
    self.filteredimage=self.filter?超标
    selectedPictureImageView.image=uiImage(cgImage:self.context.createCgImage(self.filteredImage!),来自:(self.filteredimage?程度)!!)
    sliderValue=sender.value
    
    
    }否则,如果sender.tag==1{
    
    让DisplayInPercentage:int=int((sender.value/200)*10000)
    对比度值label.text=“(DisplayInPercentage)”)
    self.selectedPictureImageView.image=原始图像
    让beginImage=ciimage(image:self.selectedPictureImageView.image!)
    self.filter=cifilter(名称:“cicolorcontrols”)
    自我过滤器?.setvalue(beginimage,forkey:kciinputimagekey)
    self.filter.setvalue(sender.value,forkey:kciinputcontractkey)
    self.filteredimage=self.filter?超标
    self.selectedPictureImageView.image=uiImage(cgImage:self.context.createCgImage(self.filteredImage!),来自:(self.filteredimage?程度)!!)
    sliderValue=sender.value
    
    }否则,如果sender.tag==2{
    
    让DisplayInPercentage:int=int((sender.value/200)*10000)
    饱和值label.text=“(DisplayInPercentage)”)
    self.selectedPictureImageView.image=原始图像
    让beginImage=ciimage(image:self.selectedPictureImageView.image!)
    self.filter=cifilter(名称:“cicolorcontrols”)
    自我过滤器?.setvalue(beginimage,forkey:kciinputimagekey)
    self.filter.setvalue(sender.value,forkey:kciinputstationkey)
    self.filteredimage=self.filter?超标
    self.selectedPictureImageView.image=uiImage(cgImage:self.context.createCgImage(self.filteredImage!),来自:(self.filteredimage?程度)!!)
    sliderValue=sender.value
    
    }否则,如果sender.tag==3{
    
    让DisplayInPercentage:int=int((sender.value/200)*10000)
    锐化值label.text=“(DisplayInPercentage)”)
    self.selectedPictureImageView.image=原始图像
    让beginImage=ciimage(image:self.selectedPictureImageView.image!)
    self.filter=cifilter(名称:“ciunsharpmask”)
    自我过滤器?.setvalue(beginimage,forkey:kciinputimagekey)
    自滤波设定值(7,forkey:kciinputradiuskey)
    self.filter.setvalue(sender.value,forkey:kciinputintensitykey)
    self.filteredimage=self.filter?超标
    self.selectedPictureImageView.image=uiImage(cgImage:self.context.createCgImage(self.filteredImage!),来自:(self.filteredimage?程度)!!)
    sliderValue=sender.value
    
    }
    }
    
    @objc func slidervaluedidend(u sender:uislider!){
    
    如果sender.tag==0{
    originalImage=selectedPictureImageView.image
    sender.value=幻灯片值
    打印(“未按下的按钮滑块值为\(sender.value)”)
    }否则,如果sender.tag==1{
    originalImage=selectedPictureImageView.image
    sender.value=幻灯片值
    打印(“未按下的按钮滑块值为\(sender.value)”)
    }否则,如果sender.tag==2{
    originalImage=selectedPictureImageView.image
    sender.value=幻灯片值
    打印(“未按下的按钮滑块值为\(sender.value)”)
    }否则,如果sender.tag==3{
    originalImage=selectedPictureImageView.image
    sender.value=幻灯片值
    打印(“未按下的按钮滑块值为\(sender.value)”)
    }
    }
    < /代码> 
    
    

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

    Interface

    这里是一个预览,当我把亮度最大化(图像变白),然后尝试调整它的对比度和滑块改变原始图像的对比度。

    Filters work independetly!

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

    Works!.

    现在的问题是,当我单击滑块而不更改其值时,它将当前值翻倍。例如,如果我将亮度5和饱和度10放在一起,并决定在单击亮度后立即调整亮度,它的值将加倍,我不知道为什么。 下面是一个例子。我只是点击滑块而不改变它的值。

    enter image description here

    这是密码

      @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)")
        }
    }
    

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   Leo Dabus    6 年前

    问题是,每次滑动滑块时,都会将过滤器应用于上一个过滤器的结果图像,而不是将其应用于原始图像。顺便说一句,如果你只是在用户完成后创建一个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)
    }