ios - tutorial - uinavigationcontroller custom title



ios: как размыть изображение с помощью CGPath? (1)

Я создаю область 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 одновременно. Я думаю, что могу размыть исходный образ и объединить его с клипом, но я не знаю, как его реализовать.


Для достижения конечного результата вам потребовалось 2 концепции:

i) CGBlendMode ii) CIFilter

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



    }

}

Достигнута миссия

Последняя демонстрация Github





core-graphics