如何使用 Core Image APIs 将图像模糊成 `UIVisualView` 效果?
How to use Core Image APIs to blur a image looks just like the `UIVisualView` effect?
下图第一张为原图
第二张图片是使用 Core Image API.
实现的模糊图片
第三张图片是使用 UIVisualView
实现的模糊图片。
很明显Core Image把图片弄模糊了,缩小了。更大的半径导致更宽的白色边框。
问题:如何使用core image做出UIVisualView
效果的视觉效果
至少,如何使用 Core Image 模糊没有白色边框的图像。
func blur(image: UIImage, withRadius radius: Float) -> UIImage {
let context = CIContext(options: nil)
let image = CIImage(image: image)
let filter = CIFilter(name: "CIGaussianBlur")
filter?.setValue(image, forKey: kCIInputImageKey)
filter?.setValue(radius, forKey: "inputRadius")
let result = filter?.outputImage
return UIImage(cgImage: context.createCGImage(result!, from: (result?.extent)!)!)
}
第三张图是
func addVisualEffectView() {
let effectView = UIVisualEffectView(effect: UIBlurEffect(style:.light))
effectView.frame = originalImageView.bounds // originalImageView is the ImageView represents the original image
originalImageView.addSubview(effectView)
}
使用这个我得到了像视觉效果视图一样的模糊效果。
func blurredImage(with sourceImage: UIImage) -> UIImage {
// Create our blurred image
let context = CIContext(options: nil)
let inputImage = CIImage(cgImage: sourceImage.cgImage as! CGImage)
// Setting up Gaussian Blur
var filter = CIFilter(name: "CIGaussianBlur")
filter?.setValue(inputImage, forKey: kCIInputImageKey)
filter?.setValue(50.0, forKey: "inputRadius")
let result = filter?.value(forKey: kCIOutputImageKey) as? CIImage
/* CIGaussianBlur has a tendency to shrink the image a little, this ensures it matches
* up exactly to the bounds of our original image */
let cgImage = context.createCGImage(result ?? CIImage(), from: inputImage.extent)
let retVal = UIImage(cgImage: cgImage!)
return retVal
}
CI上下文。核心图像的所有处理都在 CIContext 中完成。这有点类似于 Core Graphics 或 OpenGL 上下文。
使用提供的 CIImage 在上下文中调用 createCGImage(from:) 将 return 一个新的 CGImage 实例。
本教程将有助于理解:
Core Image Tutorial: Getting Started
这是输出:
你可以在图像视图上方创建一个UIImageView
和一个UIViewVisualEffectView
,然后将其渲染为图像,见我的方法:
extension UIImage
{
var glass: UIImage?
{
let area = CGRect(x: 0, y: 0, width: size.width, height: size.height)
let mainView = UIView(frame: area)
let imageView = UIImageView(image: self)
imageView.frame = area
let blurEffect = UIBlurEffect(style: .light)
let blurredEffectView = UIVisualEffectView(effect: blurEffect)
blurredEffectView.frame = area
mainView.addSubview(imageView)
mainView.addSubview(blurredEffectView)
let renderer = UIGraphicsImageRenderer(size: size)
let blurImage = renderer.image { _ in
mainView.drawHierarchy(in: area, afterScreenUpdates: true)
}
return blurImage
}
}
下图第一张为原图
第二张图片是使用 Core Image API.
实现的模糊图片
第三张图片是使用 UIVisualView
实现的模糊图片。
很明显Core Image把图片弄模糊了,缩小了。更大的半径导致更宽的白色边框。
问题:如何使用core image做出UIVisualView
效果的视觉效果
至少,如何使用 Core Image 模糊没有白色边框的图像。
func blur(image: UIImage, withRadius radius: Float) -> UIImage {
let context = CIContext(options: nil)
let image = CIImage(image: image)
let filter = CIFilter(name: "CIGaussianBlur")
filter?.setValue(image, forKey: kCIInputImageKey)
filter?.setValue(radius, forKey: "inputRadius")
let result = filter?.outputImage
return UIImage(cgImage: context.createCGImage(result!, from: (result?.extent)!)!)
}
第三张图是
func addVisualEffectView() {
let effectView = UIVisualEffectView(effect: UIBlurEffect(style:.light))
effectView.frame = originalImageView.bounds // originalImageView is the ImageView represents the original image
originalImageView.addSubview(effectView)
}
使用这个我得到了像视觉效果视图一样的模糊效果。
func blurredImage(with sourceImage: UIImage) -> UIImage {
// Create our blurred image
let context = CIContext(options: nil)
let inputImage = CIImage(cgImage: sourceImage.cgImage as! CGImage)
// Setting up Gaussian Blur
var filter = CIFilter(name: "CIGaussianBlur")
filter?.setValue(inputImage, forKey: kCIInputImageKey)
filter?.setValue(50.0, forKey: "inputRadius")
let result = filter?.value(forKey: kCIOutputImageKey) as? CIImage
/* CIGaussianBlur has a tendency to shrink the image a little, this ensures it matches
* up exactly to the bounds of our original image */
let cgImage = context.createCGImage(result ?? CIImage(), from: inputImage.extent)
let retVal = UIImage(cgImage: cgImage!)
return retVal
}
CI上下文。核心图像的所有处理都在 CIContext 中完成。这有点类似于 Core Graphics 或 OpenGL 上下文。
使用提供的 CIImage 在上下文中调用 createCGImage(from:) 将 return 一个新的 CGImage 实例。
本教程将有助于理解:
Core Image Tutorial: Getting Started
这是输出:
你可以在图像视图上方创建一个UIImageView
和一个UIViewVisualEffectView
,然后将其渲染为图像,见我的方法:
extension UIImage
{
var glass: UIImage?
{
let area = CGRect(x: 0, y: 0, width: size.width, height: size.height)
let mainView = UIView(frame: area)
let imageView = UIImageView(image: self)
imageView.frame = area
let blurEffect = UIBlurEffect(style: .light)
let blurredEffectView = UIVisualEffectView(effect: blurEffect)
blurredEffectView.frame = area
mainView.addSubview(imageView)
mainView.addSubview(blurredEffectView)
let renderer = UIGraphicsImageRenderer(size: size)
let blurImage = renderer.image { _ in
mainView.drawHierarchy(in: area, afterScreenUpdates: true)
}
return blurImage
}
}