Desenfoque gaussiano en pantalla completa

Quiero difuminar toda la pantalla de mi aplicación de iOS, y no puedo usar UIBlurEffect porque quiero poder controlar la borrosidad. Estoy intentando usar CIGaussianBlur , pero estoy teniendo problemas con los bordes de la pantalla.

CIFilter una captura de pantalla de la pantalla, y luego la CIFilter a través de un CIFilter con CIGaussianBlur , convirtiendo el CIImage nuevo a UIImage , y agregando la nueva image borrosa en la parte superior de la pantalla.

Aquí está mi código:

  let layer = UIApplication.shanetworkingApplication().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) 

Esto es lo que veo:

Desenfoque gaussiano aplicado a la captura de pantalla

Parece casi correcto excepto los bordes. Parece que la borrosidad está despegando desde el radio borroso hasta el borde. Intenté jugar con el tamaño de context pero no pude hacerlo funcionar.

¿Cómo puedo hacer que el desenfoque llegue hasta los bordes?

Está sucediendo porque el filter borroso gaussiano muestra píxeles fuera de los bordes de la image. Pero debido a que no hay píxeles, obtienes este extraño artefacto. Puede usar el filter "CIAffineClamp" para "extender" su image infinitamente en todas las direcciones.

Consulte esta respuesta https://stackoverflow.com/a/18138742/762779

Intenté ejecutar el código con los filters 'CIAffineClamp-> CIGaussianBlur' encadenados y obtuve buenos resultados.

 let layer = UIApplication.shanetworkingApplication().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)