ios: ¿Cómo desenfocar una image con CGPath?

introduzca la descripción de la imagen aquí

Creo un área CGPath como se muestra en el círculo verde. El área CGPath debe ser clara, y el rest de la image se aplicará con efecto borroso o translúcido, puedo recortar la image dentro de CGPath con el siguiente código:

UIGraphicsBeginImageContext(view.frame.size); CGContextAddPath(ctx, path); CGContextClip(ctx); [view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *clipImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); UIImageWriteToSavedPhotosAlbum(clipImage, nil, nil, nil); CGPathRelease(path); 

pero no sé cómo aplicar efecto borroso o translúcido con CGPath simultáneamente. Creo que puedo difuminar la image de origen y combinarla con una image de clip, pero no sé cómo implementarla.

Necesitabas 2 conceptos para lograr el resultado final:

i) CGBlendMode ii) CIFilter

CGBlendMode se utiliza para eliminar la parte deseada de la image. Operaciones de composition en paths que residen entre sí en el context actual. El modo claro cuyo rawValue es 16 ayuda a borrar la porción deseada.


CIFilter ayuda a difuminar la image final.

 class ConvertToBlurryImage:UIView { var originalImage:UIImage! var finalImage:UIImage! override func draw(_ rect: CGRect) { super.draw(rect) //Original Image originalImage = UIImage(named: "originalImage.png") //Intermediate Image let intermediateImage = UIImage().returnBlurImage(image: originalImage) //Final Result Image finalImage = blendImage(image: intermediateImage) let attachedImage = UIImageView(image: finalImage) addSubview(attachedImage) } func blurryImage(image:UIImage) -> UIImage { UIGraphicsBeginImageContext(frame.size) image.draw(in: CGRect(origin: frame.origin, size: frame.size) ) // 16 === clear let mode = CGBlendMode(rawValue: 16) UIGraphicsGetCurrentContext()!.setBlendMode(mode!) //Path that need to crop pathToCrop() let mode2 = CGBlendMode(rawValue: 16) UIGraphicsGetCurrentContext()!.setBlendMode(mode2!) let finalImage = UIGraphicsGetImageFromCurrentImageContext() return finalImage! } func pathToCrop() { let path = UIBezierPath(ovalIn: CGRect(x: frame.width/2 - 50, y: frame.height/2 - 100 , width: 150, height: 150) ) path.fill() path.stroke() } } extension UIImage { func returnBlurImage(image:UIImage) -> UIImage { let beginImage = CIImage(cgImage: image.cgImage!) let blurfilter = CIFilter(name: "CIGaussianBlur") blurfilter?.setValue(beginImage, forKey: "inputImage") let resultImage = blurfilter?.value(forKey: "outputImage") as! CIImage let blurnetworkingImage = UIImage(ciImage: resultImage) return blurnetworkingImage } } 

Misión lograda

introduzca la descripción de la imagen aquí

Demostración final de Github