【发布时间】:2020-02-03 07:00:07
【问题描述】:
随着滑块值的变化,我希望 UIImage 具有模糊效果。
我正在使用CIGaussianBlur 滤镜来模糊图像。
代码如下
func applyBlurFilter(aCIImage: CIImage, val: CGFloat) -> UIImage {
let clampFilter = CIFilter(name: "CIAffineClamp")
clampFilter?.setDefaults()
clampFilter?.setValue(aCIImage, forKey: kCIInputImageKey)
let blurFilter = CIFilter(name: "CIGaussianBlur")
blurFilter?.setValue(clampFilter?.outputImage, forKey: kCIInputImageKey)
blurFilter?.setValue(val, forKey: kCIInputRadiusKey)
let rect = aCIImage.extent
if let output = blurFilter?.outputImage {
if let cgimg = self.context.createCGImage(output, from: rect) {
let processedImage = UIImage(cgImage: cgimg)
return processedImage
}
}
return image ?? self.image
}
注意:我也使用CICrop过滤器尝试了以下代码
func applyBlurFilter(beginImage: CIImage, value: Float) -> UIImage? {
let currentFilter = CIFilter(name: "CIGaussianBlur")
currentFilter?.setValue(beginImage, forKey: kCIInputImageKey)
currentFilter?.setValue(value, forKey: kCIInputRadiusKey)
let cropFilter = CIFilter(name: "CICrop")
cropFilter?.setValue(currentFilter!.outputImage, forKey: kCIInputImageKey)
cropFilter?.setValue(CIVector(cgRect: beginImage!.extent), forKey: "inputRectangle")
let output = cropFilter?.outputImage
let context = CIContext(options: nil)
let cgimg = self.context.createCGImage(output!, from: beginImage!.extent)
let processedImage = UIImage(cgImage: cgimg!)
return processedImage
}
该代码与某些图像完美配合,但对于较大的图像,在将模糊滤镜应用于图像时,图像的右边缘变得透明,这是我不想要的。
注意:我在设备上运行它
我在这里做错了什么,我不知道
The image whose right edge gets transparant
Result after applying GaussianBlur to the above image
谢谢!!
【问题讨论】:
-
您的问题需要设置范围属性,但我不知道确切。阅读并进行实验。
-
您可以尝试使用
aCIImage.clampedToExtent作为高斯滤波器的输入吗?从理论上讲,它与CIAffineClamp-Filter 的作用相同,但谁知道呢。 -
@DavidH 感谢您的回复!将寻找您提供的解决方案
-
@PaulSchröder 感谢您的回复!我也尝试过使用clampedToExtent,但它对我不起作用
-
@DavidH 我已经给出了编辑问题中图片的链接,请查看
标签: ios swift uiimage gaussianblur