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

Posted

技术标签:

【中文标题】ios:如何使用 CGPath 模糊图像?【英文标题】:ios: how to blur a image with CGPath? 【发布时间】:2013-05-29 00:46:22 【问题描述】:

我创建了一个 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】:

您需要 2 个概念才能达到最终结果:-

i) CGBlendMode ii) CIFilter

CGBlendMode 用于从图像中删除所需的部分。在 Current Context 中对彼此驻留的路径进行合成操作。 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
        
        
        
    
    

任务完成

Final Github Demo

【讨论】:

嗨,我该如何做相反的事情?我希望圆圈模糊,其余部分清晰。谢谢!

以上是关于ios:如何使用 CGPath 模糊图像?的主要内容,如果未能解决你的问题,请参考以下文章

ios如何有效使用模糊效果

在 iOS 中应用模糊滤镜时如何从图像中删除黑色阴影矩形?

为啥应用程序图标在 iOS 上如此模糊,当它在 1024x1024 下看起来很好时,如何解决这个问题使图像更清晰?

在iOS中拖动时如何修改UIVisualEffectView的模糊度?

Launch Image 在后台加载模糊的游戏图像

如何在ios中进行图像处理