CIColorControls & UISleader w/ Swift 4

CIColorControls & UISlider w/ Swift 4

我正在尝试让滑块影响 UIImageView 的亮度。

我的出路和行动:

 @IBOutlet weak var previewImage: UIImageView!

    @IBAction func adjustBrightness(_ sender: UISlider) {

        let currentValue = CGFloat(sender.value)
        print(currentValue)

        let coreImage = CIImage(image: previewImage.image!)

        let filter = CIFilter(name: "CIColorControls")
        filter?.setValue(coreImage, forKey: kCIInputImageKey)
        filter?.setValue(currentValue, forKey: kCIInputBrightnessKey)

        if let ciimage = filter!.outputImage {
            let filteredImage = ciimage
            previewImage.image = UIImage(ciImage: filteredImage)
        }
     }

和我的 min/max 值:

我的图像变成纯白色并忽略了滑块 input/sender.value vals。关于我在这里做错了什么有什么想法吗?

谢谢!

问题出在这一行:

previewImage.image = UIImage(ciImage: filteredImage)

您不能通过使用该初始化程序从 CIImage 神奇地创建 UIImage。你的图像视图是空的,因为你通过这样做有效地将它的图像设置为 nil 。相反,您必须 render CIImage。例如,参见我的回答 .

(Apple 声称图像视图本身将在此配置中呈现 CIImage,但我从未见过该声明得到证实。)

但是,我们可能会更进一步指出,如果目标是允许用户移动滑块并实时更改图像的亮度,那么您的方法永远行不通。您根本无法使用 UIImageView 来显示将执行此操作的图像,因为每次移动滑块时,我们都必须重新渲染,这 非常非常慢。相反,您应该使用 Metal 视图进行渲染(如我的回答 中所述);这是实时响应由滑块控制的 CIFilter 的方式。