【问题标题】:Gaussian blur on full screen全屏高斯模糊
【发布时间】:2016-04-30 01:50:27
【问题描述】:

我想模糊我的 iOS 应用的整个屏幕,我不能使用UIBlurEffect,因为我希望能够控制模糊。所以我尝试使用CIGaussianBlur,但屏幕边缘出现问题。

我正在截取屏幕截图,然后通过CIFilterCIGaussianBlur 运行它,将CIImage 转换回UIImage,并在屏幕顶​​部添加新的模糊图像。

这是我的代码:

    let layer = UIApplication.sharedApplication().keyWindow?.layer
    UIGraphicsBeginImageContext(view.frame.size)

    layer!.renderInContext(UIGraphicsGetCurrentContext()!)
    let screenshot = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    let blurRadius = 5
    var ciimage: CIImage = CIImage(image: screenshot)!
    var filter: CIFilter = CIFilter(name:"CIGaussianBlur")!
    filter.setDefaults()
    filter.setValue(ciimage, forKey: kCIInputImageKey)
    filter.setValue(blurRadius, forKey: kCIInputRadiusKey)

    let ciContext = CIContext(options: nil)
    let result = filter.valueForKey(kCIOutputImageKey) as! CIImage!
    let cgImage = ciContext.createCGImage(result, fromRect: view.frame)

    let finalImage = UIImage(CGImage: cgImage)


    let blurImageView = UIImageView(frame: view.frame)
    blurImageView.image = finalImage
    blurImageView.sizeToFit()
    blurImageView.contentMode = .ScaleAspectFit
    blurImageView.center = view.center
    view.addSubview(blurImageView)

这是我看到的:

它看起来几乎正确,除了边缘。似乎模糊度正在从模糊半径到边缘起飞。我尝试使用上下文大小,但似乎无法使其工作。

如何让模糊一直到边缘?

【问题讨论】:

    标签: ios swift core-graphics gaussian core-image


    【解决方案1】:

    这是因为高斯模糊滤镜对图像边缘之外的像素进行采样。但是因为没有像素,你会得到这个奇怪的伪像。您可以使用"CIAffineClamp" 过滤器在各个方向上无限“扩展”您的图像。

    请看这个答案https://stackoverflow.com/a/18138742/762779

    我尝试使用链接的“CIAffineClamp-> CIGaussianBlur”过滤器运行您的代码,并获得了不错的结果。

    let layer = UIApplication.sharedApplication().keyWindow?.layer
    UIGraphicsBeginImageContext(view.frame.size)
    
    layer!.renderInContext(UIGraphicsGetCurrentContext()!)
    let screenshot = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
    let blurRadius = 5
    let ciimage: CIImage = CIImage(image: screenshot)!
    
    // Added "CIAffineClamp" filter 
    let affineClampFilter = CIFilter(name: "CIAffineClamp")!
    affineClampFilter.setDefaults()
    affineClampFilter.setValue(ciimage, forKey: kCIInputImageKey)
    let resultClamp = affineClampFilter.valueForKey(kCIOutputImageKey)
    
    // resultClamp is used as input for "CIGaussianBlur" filter
    let filter: CIFilter = CIFilter(name:"CIGaussianBlur")!
    filter.setDefaults()
    filter.setValue(resultClamp, forKey: kCIInputImageKey)
    filter.setValue(blurRadius, forKey: kCIInputRadiusKey)
    
    
    let ciContext = CIContext(options: nil)
    let result = filter.valueForKey(kCIOutputImageKey) as! CIImage!
    let cgImage = ciContext.createCGImage(result, fromRect: ciimage.extent) // changed to ciiimage.extend 
    
    let finalImage = UIImage(CGImage: cgImage)
    
    let blurImageView = UIImageView(frame: view.frame)
    blurImageView.image = finalImage
    blurImageView.sizeToFit()
    blurImageView.contentMode = .ScaleAspectFit
    blurImageView.center = view.center
    view.addSubview(blurImageView)
    

    【讨论】:

    • 先生,您应该为这个答案取得某种成就。它就像一个魅力。!谢谢你:)
    猜你喜欢
    • 2018-05-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 2011-12-07
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多