ios - 将 CIGaussianBlur 应用于 UIImage 无法正常工作

标签 ios swift uiimage gaussianblur

我希望随着 slider 值的变化对 UIImage 产生模糊效果。

我正在使用 CIGaussianBlur 滤镜来模糊图像。

代码如下

func applyBlurFilter(aCIImage: CIImage, val: CGFloat) -> UIImage {
    let clampFilter = CIFilter(name: "CIAffineClamp")
    clampFilter?.setDefaults()
    clampFilter?.setValue(aCIImage, forKey: kCIInputImageKey)

    let blurFilter = CIFilter(name: "CIGaussianBlur")
    blurFilter?.setValue(clampFilter?.outputImage, forKey: kCIInputImageKey)
    blurFilter?.setValue(val, forKey: kCIInputRadiusKey)

    let rect = aCIImage.extent
    if let output = blurFilter?.outputImage {
        if let cgimg = self.context.createCGImage(output, from: rect) {
            let processedImage = UIImage(cgImage: cgimg)
            return processedImage
        }
    }
    return image ?? self.image
}

注意:我还使用 CICrop 过滤器尝试了以下代码

func applyBlurFilter(beginImage: CIImage, value: Float) -> UIImage? {
    let currentFilter = CIFilter(name: "CIGaussianBlur")
    currentFilter?.setValue(beginImage, forKey: kCIInputImageKey)
    currentFilter?.setValue(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 context = CIContext(options: nil)
    let cgimg = self.context.createCGImage(output!, from: beginImage!.extent)
    let processedImage = UIImage(cgImage: cgimg!)
    return processedImage
}

该代码可以完美地处理某些图像,但对于较大的图像,在将模糊滤镜应用于图像时,图像的右边缘变得透明,这是我不希望的。

注意:我正在设备上运行此程序

我在这里做错了什么,我不知道

The image whose right edge gets transparant

Result after applying GaussianBlur to the above image

谢谢!!

最佳答案

好吧,你在某个地方做错了什么。在你的职业生涯中,我能给你的绝对最好的建议是,当你遇到这样的问题时,创建一个小型测试项目来进行试验 - 我在 Apple 世界里已经这样做了 15 年,它给了你巨大的帮助。

我创建了一个项目here所以你不必(这次)。我下载了图像,将其放置在 ImageView 中,它看起来很完美(正如预期的那样)。然后我使用了你的代码(除了我必须创建一个上下文,并猜测半径值,然后运行它。图像看起来很完美,模糊度为 0、5、10 和 25。

显然,问题出在您正在做的其他事情上。我建议您不断添加到测试项目中,直到找到问题所在的步骤(上下文?其他图像处理?)

这是我的全部代码:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()


        let im1 = UIImage(named: "Image.jpg")!
        let cim = CIImage(image: im1)!
        let im2 = applyBlurFilter(aCIImage: cim, val: 25)

        let iv = UIImageView(image: im2)
        iv.contentMode = .scaleToFill

        self.view.addSubview(iv)
    }

    func applyBlurFilter(aCIImage: CIImage, val: CGFloat) -> UIImage {
        let clampFilter = CIFilter(name: "CIAffineClamp")
        clampFilter?.setDefaults()
        clampFilter?.setValue(aCIImage, forKey: kCIInputImageKey)

        let blurFilter = CIFilter(name: "CIGaussianBlur")
        blurFilter?.setValue(clampFilter?.outputImage, forKey: kCIInputImageKey)
        blurFilter?.setValue(val, forKey: kCIInputRadiusKey)

        let rect = aCIImage.extent
        if let output = blurFilter?.outputImage {
            let context = CIContext(options: nil)
            if let cgimg = context.createCGImage(output, from: rect) {
                let processedImage = UIImage(cgImage: cgimg)
                return processedImage
            }
        }
        fatalError()
    }

}

关于ios - 将 CIGaussianBlur 应用于 UIImage 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60034485/

相关文章:

ios - 两个根演示文稿之间的 MvvmCross v5 动画

objective-c - 从 web 服务器为视网膜显示 iOS 下载图像

objective-c - 如何使用 AnyClass 对象中定义的类型在 Swift 中声明变量?

ios - 如何对存储在字典中的元组内的数组进行排序

iphone - presentModalViewController :Animated is deprecated in ios6

ios - 屏幕尺寸减去广告尺寸

ios - Worklight WL.Client.Push.onReadyToSubscribe 未被解雇

ios - 检测一个 UIView 何时位于另一个 UIView 之上

ios - 可选类型 'UIImage?' 的值未展开

swift - UIImage Aspect Fill 和 clipsToBounds