Управление ciFilter с помощью ползунка в Swift

Я пытаюсь добиться эффекта размытия, используя фильтр CIBoxBlur для imageView.Я использую UISlider для управления значением размытия. Эффект размытия работает, когда я увеличиваю значение ползунка. Я отчетливо вижу значение размытия, применяемое к imageView. Но когда я уменьшаю значение размытия ползунка, оно применяется глубже в моем imageView.ImageView, не возвращаясь к нормальному состоянию. Я знаю, почему это происходит. Но я не уверен, как это исправить.,

@IBOutlet weak var blur: UISlider!

@IBAction func blurSlider(_ sender: UISlider) {

    let currentValue = Int(sender.value)
    blur.maximumValue = 5
    blur.minimumValue = 0

    let currentFilter = CIFilter(name: "CIBoxBlur") 
    currentFilter!.setValue(CIImage(image: imageView.image!), forKey: kCIInputImageKey)
    currentFilter!.setValue(currentValue, forKey: kCIInputRadiusKey)

    let cropFilter = CIFilter(name: "CICrop")
    cropFilter!.setValue(currentFilter!.outputImage, forKey: kCIInputImageKey)
    cropFilter!.setValue(CIVector(cgRect: (CIImage(image: imageView.image!)?.extent)!), forKey: "inputRectangle")

    let output = cropFilter!.outputImage 
    let cgimg = context.createCGImage(output!, from: output!.extent)
    let processedImage = UIImage(cgImage: cgimg!)
    imageView.image = processedImage

}

Заранее спасибо.

1 ответ

Решение

Это довольно просто. Вы можете применить фильтр к исходному изображению вместо уже отфильтрованного изображения. Этот код поможет.

@IBAction func blurSlider(_ sender: UISlider) {
    let originalImage = UIImage(named: "yourimage")// replace yourimage with the name of your image
    let currentValue = Int(sender.value)

    blur.maximumValue = 5
    blur.minimumValue = 0

    let currentFilter = CIFilter(name: "CIBoxBlur")
    currentFilter!.setValue(CIImage(image: originalImage!), forKey: kCIInputImageKey)
    currentFilter!.setValue(currentValue, forKey: kCIInputRadiusKey)

    let cropFilter = CIFilter(name: "CICrop")
    cropFilter!.setValue(currentFilter!.outputImage, forKey: kCIInputImageKey)
    cropFilter!.setValue(CIVector(cgRect: (CIImage(image: originalImage!)?.extent)!), forKey: "inputRectangle")

    let output = cropFilter!.outputImage
    let cgimg = context.createCGImage(output!, from: output!.extent)
    let processedImage = UIImage(cgImage: cgimg!)
    imageView.image = processedImage

}
Другие вопросы по тегам