在 iOS 中应用模糊滤镜时如何从图像中去除黑色阴影矩形?
How to Remove Black Shadow Rectangle from Image when Applying Blur Filter in iOS?
我想在应用模糊滤镜时移除图像周围的黑色阴影边框。
请查看下面随附的屏幕截图。 Blur 函数可以正常工作但想要去除黑色阴影。我只想模糊图像。我不想应用任何带有模糊的颜色效果。请让我们知道我什么时候应该错过...
这里因为积分低所以上传了图片:
https://drive.google.com/open?id=1KtVgqRXOmIEQXh9IMyWNAlariL0hcJBN
https://drive.google.com/open?id=1l2eLq7VwFPb3-SfIokW0Ijhk2jqUvjlU
这是我对特定图像应用模糊效果的函数:
参数:
doBlurImage - 主图像想要对其进行模糊处理
imageBlurValue - 从 0 到 50 的模糊值 Float
func makeBlurImage(doBlurImage : UIImage, imageBlurValue : CGFloat) -> UIImage {
let beginImage = CIImage(image: doBlurImage)
let currentFilter = CIFilter(name: "CIGaussianBlur")
currentFilter!.setValue(beginImage, forKey: kCIInputImageKey)
currentFilter!.setValue(imageBlurValue, 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
return UIImage(ciImage: output!)
}
这些是在 ios 中生成模糊效果的可能选项:
- CIGaussianBlur 将根据Image 的背景颜色生成模糊效果。
- UIVisualEffectView 将根据 UIVisualEffectView 的 Style 生成模糊效果。 UIVisualEffectView 中的模糊效果是
.extraLight、.light、.dark、.extraDark、常规和突出。
- 建议选项 - GPUIMage - 您可以使用 GPUImage 处理库存档最佳模糊效果。
使用GPUImage的模糊效果:
var resultImage = UIImage()
let gaussianBlur = GaussianBlur()
gaussianBlur.blurRadiusInPixels = Float(ImageBlurValue)
let pictureInput = PictureInput(image: YourImage)
let pictureOutput = PictureOutput()
pictureOutput.imageAvailableCallback = {image in
print("Process completed")
resultImage = image
}
pictureInput --> gaussianBlur --> pictureOutput
pictureInput.processImage(synchronously:true)
pictureInput.removeAllTargets()
return resultImage
编码愉快!...:)
我找到了解决此问题的不同方法..
苹果说:
Applying a clamp effect before the blur filter avoids edge softening by making the original image opaque in all directions.
所以我们应该应用CIAffineClamp
滤镜来避免黑色阴影,clampedToExtent()
函数是returns通过使像素颜色沿其边缘在所有方向上无限延伸而创建的新图像,并且它已经是 CIImage
class 的成员,因此我们可以在不创建任何额外功能的情况下使用它。
所以解决方案的实现是这样的:
fileprivate final func blurImage(image: UIImage?, blurAmount: CGFloat, completionHandler: @escaping (UIImage?) -> Void) {
guard let inputImage = image else {
print("Input image is null!")
completionHandler(nil); return
}
guard let ciImage = CIImage(image: inputImage) else {
print("Cannot create ci image from ui image!")
completionHandler(nil); return
}
let blurFilter = CIFilter(name: "CIGaussianBlur")
blurFilter?.setValue(ciImage.clampedToExtent(), forKey: kCIInputImageKey)
blurFilter?.setValue(blurAmount, forKey: kCIInputRadiusKey)
guard let openGLES3 = EAGLContext(api: .openGLES3) else {
print("Cannot create openGLES3 context!")
completionHandler(nil); return
}
let context = CIContext(eaglContext: openGLES3)
guard let ciImageResult = blurFilter?.outputImage else {
print("Cannot get output image from filter!")
completionHandler(nil); return
}
guard let resultImage = context.createCGImage(ciImageResult, from: ciImage.extent) else {
print("Cannot create output image from filtered image extent!")
completionHandler(nil); return
}
completionHandler(UIImage(cgImage: resultImage))
}
注意:创建上下文很昂贵,因此您可以在函数之外创建它。
我想在应用模糊滤镜时移除图像周围的黑色阴影边框。
请查看下面随附的屏幕截图。 Blur 函数可以正常工作但想要去除黑色阴影。我只想模糊图像。我不想应用任何带有模糊的颜色效果。请让我们知道我什么时候应该错过...
这里因为积分低所以上传了图片:
https://drive.google.com/open?id=1KtVgqRXOmIEQXh9IMyWNAlariL0hcJBN https://drive.google.com/open?id=1l2eLq7VwFPb3-SfIokW0Ijhk2jqUvjlU
这是我对特定图像应用模糊效果的函数:
参数:
doBlurImage - 主图像想要对其进行模糊处理
imageBlurValue - 从 0 到 50 的模糊值 Float
func makeBlurImage(doBlurImage : UIImage, imageBlurValue : CGFloat) -> UIImage {
let beginImage = CIImage(image: doBlurImage)
let currentFilter = CIFilter(name: "CIGaussianBlur")
currentFilter!.setValue(beginImage, forKey: kCIInputImageKey)
currentFilter!.setValue(imageBlurValue, 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
return UIImage(ciImage: output!)
}
这些是在 ios 中生成模糊效果的可能选项:
- CIGaussianBlur 将根据Image 的背景颜色生成模糊效果。
- UIVisualEffectView 将根据 UIVisualEffectView 的 Style 生成模糊效果。 UIVisualEffectView 中的模糊效果是 .extraLight、.light、.dark、.extraDark、常规和突出。
- 建议选项 - GPUIMage - 您可以使用 GPUImage 处理库存档最佳模糊效果。
使用GPUImage的模糊效果:
var resultImage = UIImage()
let gaussianBlur = GaussianBlur()
gaussianBlur.blurRadiusInPixels = Float(ImageBlurValue)
let pictureInput = PictureInput(image: YourImage)
let pictureOutput = PictureOutput()
pictureOutput.imageAvailableCallback = {image in
print("Process completed")
resultImage = image
}
pictureInput --> gaussianBlur --> pictureOutput
pictureInput.processImage(synchronously:true)
pictureInput.removeAllTargets()
return resultImage
编码愉快!...:)
我找到了解决此问题的不同方法..
苹果说:
Applying a clamp effect before the blur filter avoids edge softening by making the original image opaque in all directions.
所以我们应该应用CIAffineClamp
滤镜来避免黑色阴影,clampedToExtent()
函数是returns通过使像素颜色沿其边缘在所有方向上无限延伸而创建的新图像,并且它已经是 CIImage
class 的成员,因此我们可以在不创建任何额外功能的情况下使用它。
所以解决方案的实现是这样的:
fileprivate final func blurImage(image: UIImage?, blurAmount: CGFloat, completionHandler: @escaping (UIImage?) -> Void) {
guard let inputImage = image else {
print("Input image is null!")
completionHandler(nil); return
}
guard let ciImage = CIImage(image: inputImage) else {
print("Cannot create ci image from ui image!")
completionHandler(nil); return
}
let blurFilter = CIFilter(name: "CIGaussianBlur")
blurFilter?.setValue(ciImage.clampedToExtent(), forKey: kCIInputImageKey)
blurFilter?.setValue(blurAmount, forKey: kCIInputRadiusKey)
guard let openGLES3 = EAGLContext(api: .openGLES3) else {
print("Cannot create openGLES3 context!")
completionHandler(nil); return
}
let context = CIContext(eaglContext: openGLES3)
guard let ciImageResult = blurFilter?.outputImage else {
print("Cannot get output image from filter!")
completionHandler(nil); return
}
guard let resultImage = context.createCGImage(ciImageResult, from: ciImage.extent) else {
print("Cannot create output image from filtered image extent!")
completionHandler(nil); return
}
completionHandler(UIImage(cgImage: resultImage))
}
注意:创建上下文很昂贵,因此您可以在函数之外创建它。