美文网首页iOS图像动画iOS笔记iOS 开发
【iOS开发】生成高斯模糊效果背景

【iOS开发】生成高斯模糊效果背景

作者: KyXu | 来源:发表于2015-08-07 17:19 被阅读8969次

做开发时,总是使用系统默认的白色背景会显得有些生硬,所以当我们以展示图片为目的时,不妨将图片放大、再做高斯模糊处理以作为背景。

我把这个处理过程用 Swift 封装成了一个函数,供大家参考。

//创建高斯模糊效果的背景
func createBlurBackground (image:UIImage,view:UIView,blurRadius:Float) {
    //处理原始NSData数据
    let originImage = CIImage(CGImage: image.CGImage )
    //创建高斯模糊滤镜
    let filter = CIFilter(name: "CIGaussianBlur")
    filter.setValue(originImage, forKey: kCIInputImageKey)
    filter.setValue(NSNumber(float: blurRadius), forKey: "inputRadius")
    //生成模糊图片
    let context = CIContext(options: nil)
    let result:CIImage = filter.valueForKey(kCIOutputImageKey) as! CIImage
    let blurImage = UIImage(CGImage: context.createCGImage(result, fromRect: result.extent()))
    //将模糊图片加入背景
    let w = self.view.frame.width
    let h = self.view.frame.height
    let blurImageView = UIImageView(frame: CGRectMake(-w/2, -h/2, 2*w, 2*h)) //模糊背景是界面的4倍大小
    blurImageView.contentMode = UIViewContentMode.ScaleAspectFill //使图片充满ImageView
    blurImageView.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight //保持原图长宽比
    blurImageView.image = blurImage
    self.view.insertSubview(blurImageView, belowSubview: view) //保证模糊背景在原图片View的下层
}

三个参数分别为:image(原始清晰图片)、view(你需要将生成的模糊背景插入在这个view的下层当做背景)、blurRadius(高斯模糊处理的模糊半径)

其中 let context = CIContext(options: nil)
这一句,在真机测试时,会引起控制台报错

控制台输出

这是苹果的一个 Bug ,想要回避这个信息输出可以用下面这一句进行替换:
let context = CIContext(options:[kCIContextUseSoftwareRenderer : true])
这句可以使图片渲染工作在 CPU 而非 GPU 完成,从而绕过这个 Bug,但是会引起效率下降,耗时大大增加,不推荐使用。

使用效果展示:

self.createBlurBackground(img, view: self.gifView, blurRadius: 50)
使用前 使用后

相关文章

网友评论

  • 王不饿呀:您好,swift3.0里UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight中间这个|应该是什么呀
    王不饿呀:@please_smile 好的,谢谢~
    please_smile:加到数组里就好了 [ UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight]
  • ufogxl:楼主,把你这个图用作scrollview的背景来响应拉动模糊时图为什么会缩小?
    ufogxl:@ufogxl 这个生成的ImageView的Frame的值随着拉动会变化,和tableView的contentoffset一样的大小
    ufogxl:@KyXu 我是把它用作tableView的背景了
    KyXu:@ufogxl 不知道你的实现细节,不好说啊。不过可以肯定的是,因为现在的模糊背景是大于原图的,所以直观的思路是,做两个 ScrollView,后面那个背景的的 ScrollView 的 offset.x 值,应该是原图的 ScrollView 的 offset.x 值,乘一个比例。另外还会有一些别的细节要优化。
  • 嗯o哼:为什么 我使用的时候 会非常的卡
    嗯o哼:@ufogxl 真机 也是 如此
    ufogxl:用真机
    KyXu:@万里_飞哥 http://www.jianshu.com/p/ae3e6e35c42a
  • 独风孤月:为什么要放大四倍?
    KyXu:@独风孤月 这只是一种选择,你也可以让它不放大,或者放大16倍、64倍等等。只是适当地放大图片,会让用户看见的那片区域集中在图片的某一小部分,画面复杂度降低,颜色少,更适合当背面,不至于影响用户视线焦点

本文标题:【iOS开发】生成高斯模糊效果背景

本文链接:https://www.haomeiwen.com/subject/qtpbqttx.html