如何使用Swift模糊UIImageView中的现有图像?

设置很简单。

  • 带有UIImageView的ViewController,分配了一个图像。
  • UIButton在单击时会模糊UIImageView中的图像。

故事板

import UIKit class ViewController: UIViewController { @IBOutlet weak var bg: UIImageView! @IBAction func blur(_ sender: Any) { let inputImage = CIImage(cgImage: (bg.image?.cgImage)!) let filter = CIFilter(name: "CIGaussianBlur") filter?.setValue(inputImage, forKey: "inputImage") filter?.setValue(10, forKey: "inputRadius") let blurred = filter?.outputImage bg.image = UIImage(ciImage: blurred!) } } 

点击button时,屏幕变成白色。 无法弄清楚我做错了什么。 任何人都知道我在做什么错了?

您可以简单地使用UIVisualEffect来实现模糊效果。 当您试图使用CoreImage实现模糊效果。请在import CoreImage到您的类后尝试下面的代码。

 var context = CIContext(options: nil) func blurEffect() { let currentFilter = CIFilter(name: "CIGaussianBlur") let beginImage = CIImage(image: bg.image!) currentFilter!.setValue(beginImage, forKey: kCIInputImageKey) currentFilter!.setValue(10, 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!) bg.image = processedImage } 

输出:

在这里输入图像说明

注意:我build议你在真实的设备上testing代码,因为在coreImage上模拟器的性能太慢了。

对于那些❤️协议

 protocol Bluring { func addBlur(_ alpha: CGFloat) } extension Bluring where Self: UIView { func addBlur(_ alpha: CGFloat = 0.5) { // create effect let effect = UIBlurEffect(style: .dark) let effectView = UIVisualEffectView(effect: effect) // set boundry and alpha effectView.frame = self.bounds effectView.autoresizingMask = [.flexibleWidth, .flexibleHeight] effectView.alpha = alpha self.addSubview(effectView) } } // Conformance extension UIView: Bluring {} // use someImageview.addBlur() 

以下是我在SWIFT 3.1中得到的预期结果:希望这会有所帮助。

 func blurImage(image:UIImage) -> UIImage? { let context = CIContext(options: nil) let inputImage = CIImage(image: image) let originalOrientation = image.imageOrientation let originalScale = image.scale let filter = CIFilter(name: "CIGaussianBlur") filter?.setValue(inputImage, forKey: kCIInputImageKey) filter?.setValue(10.0, forKey: kCIInputRadiusKey) let outputImage = filter?.outputImage var cgImage:CGImage? if let asd = outputImage { cgImage = context.createCGImage(asd, from: (inputImage?.extent)!) } if let cgImageA = cgImage { return UIImage(cgImage: cgImageA, scale: originalScale, orientation: originalOrientation) } return nil } 

我在NSObject类中做了模糊处理,所以我可以很容易地在整个项目中使用这个方法。

 class Helper: NSObject { class func addBlurView(_ inView : UIView) -> UIVisualEffectView { let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark) let blurEffectView = UIVisualEffectView(effect: blurEffect) //always fill the view blurEffectView.frame = inView.bounds blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight] blurEffectView.alpha = 0.5 return blurEffectView } } 

在ViewController中,我创build了UIVisualEffectView的对象。 然后调用助手类的方法来添加模糊。

 import UIKit class ViewController: UIViewController { var blurEffectView : UIVisualEffectView! override func viewDidLoad() { super.viewDidLoad() blurEffectView = Helper.addBlurView((imgView)!) self.imgView.addSubview(blurEffectView) } 

您可以通过UIBlurEffectUIVisualEffectView添加模糊效果:

 @IBAction func blur(_ sender: Any) { let darkBlur = UIBlurEffect(style: UIBlurEffectStyle.dark) let blurView = UIVisualEffectView(effect: darkBlur) blurView.frame = bg_imagview.bounds blurView.autoresizingMask = [.flexibleWidth, .flexibleHeight] bg_imagview.addSubview(blurView) } 

用这个:

  import UIKit class ViewController: UIViewController { @IBOutlet weak var bgImageView: UIImageView! @IBOutlet weak var blurButton: UIButton! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func blurButtonTapped(_ sender: Any) { let inputImage = CIImage(cgImage: (self.bgImageView.image?.cgImage)!) let filter = CIFilter(name: "CIGaussianBlur") filter?.setValue(inputImage, forKey: "inputImage") filter?.setValue(10, forKey: "inputRadius") let blurred = filter?.outputImage var newImageSize: CGRect = (blurred?.extent)! newImageSize.origin.x += (newImageSize.size.width - (self.bgImageView.image?.size.width)!) / 2 newImageSize.origin.y += (newImageSize.size.height - (self.bgImageView.image?.size.height)!) / 2 newImageSize.size = (self.bgImageView.image?.size)! let resultImage: CIImage = filter?.value(forKey: "outputImage") as! CIImage let context: CIContext = CIContext.init(options: nil) let cgimg: CGImage = context.createCGImage(resultImage, from: newImageSize)! let blurredImage: UIImage = UIImage.init(cgImage: cgimg) self.bgImageView.image = blurredImage } } 

输出:

在这里输入图像说明

Gitbub链接:

https://github.com/k-sathireddy/ImageBlurEffect