iOS:如何使用CGPath模糊图像?

5

enter image description here

我创建了一个像绿色圆圈一样的CGPath区域。这个CGPath区域需要是透明的,而图片的其余部分将被应用模糊或半透明效果。我可以使用以下代码将图片剪切到CGPath内:

UIGraphicsBeginImageContext(view.frame.size);
CGContextAddPath(ctx, path);
CGContextClip(ctx);

[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *clipImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(clipImage, nil, nil, nil);
CGPathRelease(path);

但是我不知道如何同时使用CGPath应用模糊或半透明效果。我认为我可以对原始图像进行模糊处理并将其与剪辑图像合并,但我不知道如何实现。

1个回答

1

您需要掌握两个概念才能实现最终结果:

i) CGBlendMode(混合模式)

ii) CIFilter(Core Image 滤镜)

CGBlendMode 用于从图像中删除所需部分。在当前上下文中,路径之间的组合操作。 清除模式,其 rawValue 为16,可帮助清除所需部分。


CIFilter帮助模糊最终图像。
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 blurredImage = UIImage(ciImage: resultImage)

        return blurredImage
        
        
        
    }
    
}

任务完成

enter image description here

最终Github演示


你好,我该如何做到相反的效果?我想让圆形变得模糊,而其他部分保持清晰。谢谢! - devjme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接