【问题标题】:Blur effect using slider Is not working properly使用滑块的模糊效果无法正常工作
【发布时间】:2018-02-16 22:02:49
【问题描述】:

我使用了一个滑块来为我的图像添加模糊效果。我正在使用以下代码:

let currentFilter = CIFilter(name: "CIGaussianBlur")
let beginImage = CIImage(image: imgImage.image!)

currentFilter!.setValue(beginImage, forKey: kCIInputImageKey)
currentFilter!.setValue(sender.value, forKey: kCIInputRadiusKey)

let cropFilter = CIFilter(name: "CICrop")

cropFilter!.setValue(currentFilter!.outputImage, forKey: kCIInputImageKey)
cropFilter!.setValue(CIVector(cgRect: beginImage!.extent), forKey: "inputRectangle")

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

imgImage.image = processedImage

问题是每当滑块的值增加时,就会出现模糊效果,但是当我减小滑块的值时,它不会消除模糊效果。

【问题讨论】:

  • 请显示更多代码! (1) 你的滑块是如何连接的? (2) 你的过滤器代码很好,但是,如何执行?这两件事都很重要,因为它们可能会影响beginImageprocessImage。 (希望你也使用GLKView。)
  • @IBAction func slider(_ sender: UISlider) { DispatchQueue.main.async { self.colorControl.brightness(sender.value) self.imgImage.image = self.colorControl.outputUIImage() }
  • 我已使用此代码连接滑块,其事件发生在 Value Changed 上。 ,我没用过GLKView @dfd

标签: ios swift slider blur


【解决方案1】:

制作单独的类来添加模糊效果:

import UIKit
import GLKit

class BlurImageView: GLKView {
let clampFilter = CIFilter(name: "CIAffineClamp")!
let blurFilter = CIFilter(name: "CIGaussianBlur")!
let ciContext:CIContext

override init(frame: CGRect) {
    let glContext = EAGLContext(API: .OpenGLES2)
    ciContext = CIContext(
        EAGLContext: glContext,
        options: [
            kCIContextWorkingColorSpace: NSNull()
        ]
    )
    super.init(frame: frame, context: glContext)
    enableSetNeedsDisplay = true
}

required init(coder aDecoder: NSCoder) {
    let glContext = EAGLContext(API: .OpenGLES2)
    ciContext = CIContext(
        EAGLContext: glContext,
        options: [
            kCIContextWorkingColorSpace: NSNull()
        ]
    )
    super.init(coder: aDecoder)
    context = glContext
    enableSetNeedsDisplay = true
}

@IBInspectable var inputImage: UIImage? {
    didSet {
        inputCIImage = inputImage.map { CIImage(image: $0)! }
    }
}

@IBInspectable var blurRadius: Float = 0 {
    didSet {
        blurFilter.setValue(blurRadius, forKey: "inputRadius")
        setNeedsDisplay()
    }
}

var inputCIImage: CIImage? {
    didSet { setNeedsDisplay() }
}

override func drawRect(rect: CGRect) {
    if let inputCIImage = inputCIImage {
        clampFilter.setValue(inputCIImage, forKey: kCIInputImageKey)
        blurFilter.setValue(clampFilter.outputImage!, forKey: kCIInputImageKey)
        let rect = CGRect(x: 0, y: 0, width: drawableWidth, height: drawableHeight)
        ciContext.drawImage(blurFilter.outputImage!, inRect: rect, fromRect: inputCIImage.extent())
    }
}
}

如何使用:

class ViewController: UIViewController {

@IBOutlet var imageView: BlurImageView!

override func viewDidLoad() {
    super.viewDidLoad()
    imageView.inputImage = UIImage(named:"testImage")!
}

@IBAction func sliderValueChanged(sender: UISlider) {
    imageView.blurRadius = sender.value
}
}

【讨论】:

  • 不,它不能正常工作。它在 sliderValueChanged Action 上无法正常工作。 @Hakikat
【解决方案2】:

您可以将过滤器应用于原始图像,而不是已过滤的图像。试试下面的代码。

    let context = CIContext(options: nil)

    @IBAction func blurSlider(_ sender: UISlider) {

    let originalImage = UIImage(named: "Your Image Name")
    let currentValue = Int(sender.value)

    let currentFilter = CIFilter(name: "CIGaussianBlur")
    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!)
    imgImage.image = processedImage

    }

模拟器输出:

注意:建议您在真机上测试代码,因为模拟器在 coreImage 上的性能太慢了。

【讨论】:

猜你喜欢
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多