将 CIGaussianBlur 应用于 UIImage 无法正常工作
Applying CIGaussianBlur to UIImage not working properly
我想要在滑块值变化时 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
谢谢!!
嗯,你做错了什么地方。在您的职业生涯中,我能给您的绝对最佳建议是创建一个小型测试项目,以便在您遇到此类问题时进行试验 - 我在 Apple 世界中已经这样做了 15 年,它提供了巨大的帮助。
我创建了一个项目 here 所以你不必(这次)。我下载了图像,将它放在 ImageView 中,它看起来很完美(正如预期的那样)。然后我使用了你的代码(除非我必须创建一个上下文,并猜测半径值,然后 运行 它。图像看起来很完美,模糊度为 0、5、10 和 25。
显然问题出在您正在做的其他事情上。我的建议是你不断地添加到测试项目,直到你能找到问题所在的步骤(上下文?其他图像处理?)
这是我的全部代码:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let im1 = UIImage(named: "Image.jpg")!
let cim = CIImage(image: im1)!
let im2 = applyBlurFilter(aCIImage: cim, val: 25)
let iv = UIImageView(image: im2)
iv.contentMode = .scaleToFill
self.view.addSubview(iv)
}
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 {
let context = CIContext(options: nil)
if let cgimg = context.createCGImage(output, from: rect) {
let processedImage = UIImage(cgImage: cgimg)
return processedImage
}
}
fatalError()
}
}
我想要在滑块值变化时 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
谢谢!!
嗯,你做错了什么地方。在您的职业生涯中,我能给您的绝对最佳建议是创建一个小型测试项目,以便在您遇到此类问题时进行试验 - 我在 Apple 世界中已经这样做了 15 年,它提供了巨大的帮助。
我创建了一个项目 here 所以你不必(这次)。我下载了图像,将它放在 ImageView 中,它看起来很完美(正如预期的那样)。然后我使用了你的代码(除非我必须创建一个上下文,并猜测半径值,然后 运行 它。图像看起来很完美,模糊度为 0、5、10 和 25。
显然问题出在您正在做的其他事情上。我的建议是你不断地添加到测试项目,直到你能找到问题所在的步骤(上下文?其他图像处理?)
这是我的全部代码:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let im1 = UIImage(named: "Image.jpg")!
let cim = CIImage(image: im1)!
let im2 = applyBlurFilter(aCIImage: cim, val: 25)
let iv = UIImageView(image: im2)
iv.contentMode = .scaleToFill
self.view.addSubview(iv)
}
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 {
let context = CIContext(options: nil)
if let cgimg = context.createCGImage(output, from: rect) {
let processedImage = UIImage(cgImage: cgimg)
return processedImage
}
}
fatalError()
}
}