浅谈iOS模糊效果

前言

今年过年微信客户端临时出现了一个非常有意思的功能,好友发出带了一层蒙层的照片,发指定金额的红包即可看到清晰相片,今天我们就解开这个神秘的技术面纱。

实现技术汇总

官方:

  1. CoreImage(很早就出现的技术,缺点是转化效率低)
  2. UIBlurEffect(iOS8以后出现的新技术,效率比上面的要好,并且简单)
  3. VImage 苹果提供了一个庞大的库,进行更复杂的模糊的效果实现

非官方:

  • GPUImage(第三方大神写的框架)

让我们浅析一下上面的几种技术

1.CoreImage

imageView=[[UIImageView alloc]initWithFrame:CGRectMake(self.view.bounds.size.width/2-100,

 50, 200, 280)];

imageView.image=[self blur];

-(UIImage *)blur
{
CIContext *context=[CIContext contextWithOptions:nil];

CIImage *imageToBlur=[[CIImage alloc]initWithImage:[UIImage imageNamed:@"mm.png"]];

CIFilter *filter=[CIFilter filterWithName:@"CIGaussianBlur"

   keysAndValues:kCIInputImageKey,imageToBlur, nil];

 outputCIImage=[filter outputImage];

UIImage *image=[UIImage imageWithCGImage:[context createCGImage: 

outputCIImage fromRect:outputCIImage.extent]];

return image;

}

效果如下图所示:

需要注意:

1.利用CoreImage 进行模糊处理,是非常消耗CPU性能的,建议另辟线程进行处理,若对多线程不是太熟练的可以参考我之前iOS多线程开发系列之(三)Grand Central Dispatch(GCD)系列教程

2.在CIFilter filterWithName:@”CIGaussianBlur”中的Name参数可以根据情况选择,参数列表可以参考Apple官方教程

2.UIBlurEffect

UIBlurEffect技术是从iOS8之后引进的,比CoreImage性能上要优秀,原理是在图片上方生成一个蒙层,若最低适配iOS8的话可以考虑采取这个 ,核心代码如下:

UIBlurEffect *beffect=[UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight];

effectview=[[UIVisualEffectView alloc]initWithEffect:beffect];

effectview.frame=imageView.bounds;

运用UIBlurEffect是可逆的,我们可以去掉蒙层,显示图片

 [effectview removeFromSuperview];

UIBlurEffect如此的简单,我们利用它简单实现一下微信红包图片功能吧

 imageView=[[UIImageView 

alloc]initWithFrame:CGRectMake(self.view.bounds.size.width/2-100, 50, 200, 280)];

imageView.image=[UIImage imageNamed:@"mm.png"];

[self.view addSubview:imageView]; 

 - (IBAction)fuzzyBtn:(id)sender {
UIBlurEffect *beffect=[UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight];

effectview=[[UIVisualEffectView alloc]initWithEffect:beffect];

effectview.frame=imageView.bounds;

[imageView addSubview:effectview];
 }
    - (IBAction)LookPhoto:(id)sender {
        [effectview removeFromSuperview];
}

效果图如下:

3. GPUImage

首先要引入GPUImage框架,建议选择 工具CocoaPods进行添加,若对该工具不是太了解的可以参考我的这篇 iOS工具篇–CocoaPods

     GPUImageGaussianBlurFilter * blurFilter = [[GPUImageGaussianBlurFilter alloc] init];

     blurFilter.blurRadiusInPixels = 2.0;

     UIImage * image = [UIImage imageNamed:@"mm.png"];

     UIImage *blurredImage = [blurFilter imageByFilteringImage:image];

最后再推荐几篇关于模糊效果的文章

  1. http://beyondvincent.com/2014/01/29/2014-01-29-ios-7-blur-effects-gpuimage/
  2. http://www.molotang.com/articles/1921.html
  3. http://www.cocoachina.com/ios/20141010/9860.html
时间: 2024-10-24 19:18:30

浅谈iOS模糊效果的相关文章

浅谈iOS Crash(一)

本文讲的是浅谈iOS Crash(一),一.捕获iOS Crash 1.设置异常断点并运行 设置异常断点.png 说明:设置Xcode异常断点后运行程序,发生Crash时,断点会定位到出错的代码行,但仅适用于开发阶段.线上APP的Crash还需要通过收集Crash机制来捕获Crash并记录在日志中. 2.Mach异常 和 Unix信号 iOS Crash发生时,先产生Mach异常(最底层的内核级异常),然后Mach异常在host层被ux_exception转换为相应的Unix信号,并通过thre

浅谈iOS Crash(二)

浅谈iOS Crash(一) 一.僵尸对象(Zombie Objects) 1.概述 僵尸对象:已经被释放掉的对象.一般来说,访问已经释放的对象或向它发消息会引起错误.因为指针指向的内存块认为你无权访问或它无法执行该消息,这时候内核会抛出一个异常( EXC ),表明你不能访问该存储区域(BAD ACCESS).(EXC_BAD_ACCESS类型错误) 调试解决该类问题一般采用NSZombieEnabled(开启僵尸模式). 2.使用NSZombieEnabled Xcode提供的NSZombie

IOS中 浅谈iOS中MVVM的架构设计与团队协作

今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦~). 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 由于本人项目经验有限,关于架构设计方面的东西理解有限,我个人对MVVM的理解主要是借鉴于之前的用过的MVC的Web框架~在学校的时候用过ThinkPHP框架,和SSH框架,都是MVC的架构模式,今天MVVM与

浅谈iOS的多Window处理

概述 想必做iOS的人都知道,我们的App是通过UIWindow这个载体呈现出来的.默认情况下,iOS App对于开发者来说只有一个UIWindow,也就是AppDelegate在applicationDidFinishLaunching里面创建出来的. 但是即使我们什么都不做,在我们的APP里面也会有其他的UIWindow: 键盘对应的UITextEffectWindow 状态栏对应的UIStatusBarWindow(准确来说这个Window并不隶属于我们的App) 只不过上述两种UIWin

浅谈iOS和Android的产品交互设计:iPhone和Android的控件对比

一. 前言 开发者在产品上同时覆盖iOS平台和Android平台时,则会遇到同一个功能在不同平台中界面和交互如何展现的问题. 了解两个平台间的控件对应关系和异同点,对同时面向两个平台的产品和交互设计是有帮助的. 此部分就两个平台的控件进行对应,并辅以一定的描述,更详细的控件说明和适用的场合请直接参阅参考资料中的相关文档. 说明:Android中的系统控件会根据不同的ROM和操作系统版本有所变化,本文中Android控件以<Android Design>为主要参考. 二.目的 本文期望表达的含义

浅谈iOS中三种生成随机数方法_IOS

ios 有如下三种随机数方法: //第一种 srand((unsigned)time(0)); //不加这句每次产生的随机数不变 int i = rand() % 5; //第二种 srandom(time(0)); int i = random() % 5; //第三种 int i = arc4random() % 5 ; 注: ① rand()和random()实际并不是一个真正的伪随机数发生器,在使用之前需要先初始化随机种子,否则每次生成的随机数一样.       ② arc4random

浅谈iOS单元测试

什么是单元测试? 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等.总的来说,单元就是人为规定的最小的被测功能模块. iOS中单元测试有什么意义? 大型项目开发,功能比较繁琐,代码量比较大,调试某一块功能需要不断的Command+R运行调试,很显然这样的功能是非常非常的低效的,编写过程中以及App功能完成后

iOS开发之浅谈MVVM的架构设计与团队协作

今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦~). 由于本人项目经验有限,关于架构设计方面的东西理解有限,我个人对MVVM的理解主要是借鉴于之前的用过的MVC的Web框架~在学校的时候用过ThinkPHP框架,和SSH框架,都是MVC的架构模式,今天MVVM与传统的MVC可谓是极为相似,也可以说是兄弟关系,也就是一家人了. 说道架构设计和团队

互联网产品市场:浅谈抄袭和适度创新

文章描述:互联网产品市场:浅谈抄袭和适度创新. 前几天参加敏捷大会,最大的收获乃是听到腾讯副总裁的这番回答,对这个问题有了重新的认识(或者说重新陷入迷惑,也行). 腾讯一直以来被认为是抄袭专家,创业杀手,甚至有"gouridetengxun"说法,马化腾自己也有"喜欢慢人半步"的言论,所以似乎一切都已经有定论. 那天底下一位观众问及此问题,吴军的回答如下(很精彩,凭记忆,有出入,请原谅): view plain MP3是苹果发明的吗?不是:手机是苹果发明的吗?不是: