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

Mar*_*ens 17 uiimageview ios cifilter ciimage swift

设置很简单.

  • 带有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!)
    }
}
Run Code Online (Sandbox Code Playgroud)

单击按钮时,屏幕变为白色.无法弄清楚我做错了什么.谁知道我做错了什么?

Joe*_*Joe 24

你可以简单地UIVisualEffect用来实现模糊效果.当您尝试使用CoreImage实现模糊效果时,请在下面的代码中尝试使用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
}
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

注意:我建议您在真实设备中测试代码,因为coreImage上的模拟器性能太慢.


小智 17

对于那些❤️协议

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()
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你!只是一个问题:“协议模糊”,我相信更好的命名:) (7认同)

小智 7

以下是我在 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
    }
Run Code Online (Sandbox Code Playgroud)


phi*_*sch 6

实际上 CoreImage 中有一个方便的实现 https://developer.apple.com/documentation/coreimage/ciimage/1645897-applyinggaussianblur

extension UIImage {

func blur(_ radius: Double) -> UIImage? {
    if let img = CIImage(image: self) {
        return UIImage(ciImage: img.applyingGaussianBlur(sigma: radius)).cropped(to: img.extent)
    }
    return nil
}
Run Code Online (Sandbox Code Playgroud)

  • 这几乎可以工作,但它会改变图像大小/位置,请务必随后裁剪图像。img.applyingGaussianBlur(sigma: radius).cropped(to: img.extent) (2认同)
  • 您可以编辑答案。我已经做了。:) (2认同)