只对图像的一小部分应用CIGaussianBlur

6

我需要在图片的一个小部分上应用CIGaussianBlur滤镜,就像这样:

enter image description here

有没有办法做到这一点?例如,当我应用过滤器时,也许我认为我必须指定过滤器的维度(类似于CGRectMake)。
var imageToBlur = CIImage(image: coro.logo)
var blurfilter = CIFilter(name: "CIGaussianBlur")
blurfilter.setValue(imageToBlur, forKey: "inputImage")
blurfilter.setValue(2, forKey: "inputRadius")
var resultImage = blurfilter.valueForKey("outputImage") as! CIImage
var blurredImage = UIImage(CIImage: resultImage)
self.immagineCoro.image = blurredImage

CIFilter有一个边界矩形属性吗? - nielsbot
4个回答

12

这个想法是从源图像中取出一个矩形,模糊这个新的图像,然后将其合成回源图像。

我将其扩展为UIImage以实现更轻松的使用。

extension UIImage {

    func getImageFromRect(rect: CGRect) -> UIImage? {
        if let cg = self.CGImage,
            let mySubimage = CGImageCreateWithImageInRect(cg, rect) {
                return UIImage(CGImage: mySubimage)
        }
        return nil
    }

    func blurImage(withRadius radius: Double) -> UIImage? {
        let inputImage = UIKit.CIImage(CGImage: self.CGImage!)
        if let filter = CIFilter(name: "CIGaussianBlur") {
            filter.setValue(inputImage, forKey: kCIInputImageKey)
            filter.setValue((radius), forKey: kCIInputRadiusKey)
            if let blurred = filter.outputImage {
                return UIImage(CIImage: blurred)
            }
        }
        return nil
    }

    func drawImageInRect(inputImage: UIImage, inRect imageRect: CGRect) -> UIImage {
        UIGraphicsBeginImageContext(self.size)
        self.drawInRect(CGRectMake(0.0, 0.0, self.size.width, self.size.height))
        inputImage.drawInRect(imageRect)
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage
    }

    func applyBlurInRect(rect: CGRect, withRadius radius: Double) -> UIImage? {
        if let subImage = self.getImageFromRect(rect),
            let blurredZone = subImage.blurImage(withRadius: radius) {
                return self.drawImageInRect(blurredZone, inRect: rect)
        }
        return nil
    }

}

使用方法:

// your image
let sourceImage = UIImage(...)

// the rect to blur
let targetZone = CGRectMake(-50, sourceImage.size.height - 220, sourceImage.size.width + 100, 220)

// apply our functions to the source image
if let resultImage = sourceImage.applyBlurInRect(targetZone, withRadius: 6.0) {
    // use resultImage
}

之前:

在此输入图片描述

之后:

在此输入图片描述


3

尝试使用这个

func blurImage(image:UIImage, forRect rect: CGRect) -> UIImage?
    {
        let context = CIContext(options: nil)
        let inputImage = CIImage(CGImage: image.CGImage!)


        let filter = CIFilter(name: "CIGaussianBlur")
        filter?.setValue(inputImage, forKey: kCIInputImageKey)
        filter?.setValue((70.0), forKey: kCIInputRadiusKey)
        let outputImage = filter?.outputImage

        var cgImage:CGImageRef?

        if let asd = outputImage
        {
            cgImage = context.createCGImage(asd, fromRect: rect)
        }

        if let cgImageA = cgImage
        {
            return UIImage(CGImage: cgImageA)
        }

        return nil
    }

你能发布一个相同的 Objective-C 变体吗? - nr5
  • (UIImage*)getBluredImageFromImage:(UIImage*)image forRect:(CGRect)rect { CIContext* context = [CIContext contextWithOptions:nil]; CIImage* inputImage = [CIImage imageWithCGImage:image.CGImage]; CIFilter* filter = [CIFilter filterWithName:@"CIGaussianBlur"]; [filter setValue:inputImage forKey:kCIInputImageKey]; [filter setValue:@(70) forKey:kCIInputRadiusKey]; CIImage* outputImage = [filter outputImage];
- Che
CGImageRef cgImage;if (outputImage) cgImage = [context createCGImage:outputImage fromRect:rect]; if (cgImage) return [UIImage imageWithCGImage:cgImage]; return nil;} 请尝试将其复制/粘贴到xCode中...它会看起来更好 :) - Che

3

Swift:它看起来是一个简单的过程。

// convert UIImage to CIImage
guard let ciImage = imgage.ciImage ?? image.cgImage.map({CIImage(cgImage: $0)}) else {
   return
}


// crop out image that needs to be blurred
// be careful about bounds
let imagePartToBlur = ciImage.cropped(to: bounds)

// apply gaussian blur
let filter = CIFilter(name: "CIGaussianBlur")
filter?.setValue(faceImage, forKey: kCIInputImageKey)
filter?.setValue(32, forKey: kCIInputRadiusKey)
let outputImage = filter?.outputImage

// composite the blurred croppedout image to original image and get new image
if let newImageWithBlurredPart = outputImage?.composited(over: ciImage) {
    // now get uimage which is ready to use
    let cgImage = context.createCGImage(newImageWithBlurredPart, from: ciImage.extent)
    let image = UIImage(cgImage: cgImage)
}

1

Swift 5+ 的编辑版本

func blurImage(image: UIImage, forRect rect: CGRect) -> UIImage? {
    let context = CIContext(options: nil)
    let inputImage = CIImage(cgImage: image.cgImage!)
    
    let filter = CIFilter(name: "CIGaussianBlur")
    filter?.setValue(inputImage, forKey: kCIInputImageKey)
    filter?.setValue((70.0), forKey: kCIInputRadiusKey)
    
    guard let outputImage = filter?.outputImage,
          let cgImage = context.createCGImage(outputImage, from: rect)
    else {
        return nil
    }
    
    return UIImage(cgImage: cgImage)
}

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