How to blur an existing image in a UIImageView with Swift?

前端 未结 11 1887
自闭症患者
自闭症患者 2020-12-28 16:48

The setup is simple.

  • A ViewController with UIImageView that has an image assigned.
  • A UIButton that when clicked blurs the image in the UIImageView.<
相关标签:
11条回答
  • 2020-12-28 17:36

    A good performing solution with decent results is StackBlur which uses a clever algorithm that efficiently approximates a blur:

    This is a compromise between Gaussian Blur and Box blur It creates much better looking blurs than Box Blur, but is 7x faster than my Gaussian Blur implementation. I called it Stack Blur because this describes best how this filter works internally: it creates a kind of moving stack (or maybe a "Tower of Hanoi" kind of structure) of colors whilst scanning through the image. This "tower" controls the weights of the single pixels within the convolution kernel and gives the pixel in the center the highest weight. The secret of the speed is that the algorithm just has to add one new pixel to the right side of the stack and at the same time remove the leftmost pixel. The remaining colors on the topmost layer of the stack are either added on or reduced by one, depending on if they are on the right or on the left side of the stack.

    Check out StackBlur on Github.

    There are many versions out there, also Swift ports, but those are considerable slower than the Obj-C versions.

    Addition 2019:

    If the images to blur are remotely loaded, I can highly recommend the Nuke framework that remotely loads images and can apply a blur filter out of the box. It's application is comparable to the Glide library on Android. While blurring one image may be easy, blurring many images - like in a collection view - while considering device resource constraints is less trivial. Nuke is highly optimized for remote image loading, caching and processing. It is also extendable in several aspects. From comparing available remote image loading frameworks, I think that Nuke is the most stable and most advanced for that purpose as of Nov 2019.

    0 讨论(0)
  • 2020-12-28 17:40

    Check if something is coming nil. I had a similar issue, but in my case I wasn't creating a new instance of CIImage, because of that image.ciimage was coming nil.

    0 讨论(0)
  • 2020-12-28 17:43

    my extension

    extension UIImage {
        
        func blurImage(radius: CGFloat = 10) -> UIImage? {
            guard let cgImage = cgImage else { return nil }
            let inputCIImage = CIImage(cgImage: cgImage)
            let context = CIContext(options: nil)
            
            let filter = CIFilter(name: "CIGaussianBlur")
            filter?.setValue(inputImage, forKey: kCIInputImageKey)
            filter?.setValue(radius, forKey: kCIInputRadiusKey)
            let outputImage = filter?.outputImage
            
            if let outputImage = outputImage,
                let cgImage = context.createCGImage(outputImage, from: inputImage.extent) {
                
                return UIImage(
                    cgImage: cgImage,
                    scale: scale,
                    orientation: imageOrientation
                )
            }
            return nil
        }
     }
    
    0 讨论(0)
  • 2020-12-28 17:47

    Hey to all the LAZY guys just like me.

    Just add SwifterSwift with cocoapods.

    Import SwifterSwift.

    import SwifterSwift
    

    Blur your image view just like below.

    someImageView.blur()
    
    0 讨论(0)
  • 2020-12-28 17:48

    Use this:

     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
            }
    
        }
    

    Output:

    Gitbub link:

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

    0 讨论(0)
提交回复
热议问题