【发布时间】:2021-08-04 19:07:11
【问题描述】:
我正在开发一个照片滤镜应用程序。我想用一个滑块来改变亮度和对比度。我可以改变它们,但是当我跳到对比度时,我失去了亮度变化。哇,我可以保留应用亮度的图像,然后继续更改对比度。
if sender.tag == 0 {
self.coreImage = CIImage(image: (originalImage.image!))!
let filter2 = CIFilter(name: "CIColorControls" )
filter2!.setValue(coreImage, forKey: kCIInputImageKey)
filter2?.setValue(sender.value, forKey: kCIInputBrightnessKey)
brightnessValue = sender.value
filter2!.setValue(coreImage, forKey: kCIInputImageKey)
let filteredImageData2 = filter2!.value(forKey: kCIOutputImageKey) as! CIImage
let filteredImageRef = ciContext.createCGImage(filteredImageData2, from: filteredImageData2.extent)
let imageForButton = UIImage(cgImage: filteredImageRef!)
originalImage.isHidden = true
imageToFilter.image = imageForButton
}
else if sender.tag == 1 {
self.coreImage = CIImage(image: (originalImage.image!)) ?? CIImage()
let filter2 = CIFilter(name: "CIColorControls" )
filter2!.setValue(coreImage, forKey: kCIInputImageKey)
filter2?.setValue(sender.value, forKey: kCIInputContrastKey)
filter2!.setValue(coreImage, forKey: kCIInputImageKey)
let filteredImageData2 = filter2!.value(forKey: kCIOutputImageKey) as! CIImage
let filteredImageRef = ciContext.createCGImage(filteredImageData2, from: filteredImageData2.extent)
let imageForButton = UIImage(cgImage: filteredImageRef!)
originalImage.isHidden = true
imageToFilter.image = imageForButton
}
下面的代码控制按钮和改变什么
if (Lb == "Brightness") {
sliderColor.tag = 0
sliderColor.minimumValue = -1.0
sliderColor.maximumValue = 1.0
sliderColor.value = 0.0
} else if (Lb == "Contrast") {
sliderColor.tag = 1
sliderColor.minimumValue = 0.0
sliderColor.maximumValue = 4.0
sliderColor.value = 1.0
}
我知道这是因为我每次更改亮度或对比度时都使用 originalImage。但是,如果我将其更改为 imageToFilter,事情就会变得草率。
有什么想法吗?
【问题讨论】:
-
我认为您使用了两个滑块但其中一个动作是对还是错?
-
不,一个滑块。但我忘记了更新slider.tag 以控制当时应用哪种效果的行。
-
您可以使用两个变量来跟踪亮度和对比度的值,然后您就可以使用它了。或者第二种方法是对两个操作继续使用相同的 CIFilter,而不是为每个操作创建不同的。
-
感谢您的建议,但仅使用相同的 CIFilter 似乎不起作用:(
-
那么最好使用两个 var 并使用滑块值设置和更新这两个 var。当您移动滑块时,任何一个都应用带有轨道值的过滤键。
标签: ios swift core-graphics cifilter