iOS开发使用半透明模糊效果方法整理

虽然iOS很早就支持使用模糊效果对图片等进行处理,但尤其在iOS7以后,半透明模糊效果得到大范围广泛使用。包括今年最新发布的iOS8也沿袭了这一设计,甚至在OS X 10.10版Yosemite中也开始大量使用半透明模糊。

在iOS开发当中,我们有很多选择可以做半透明模糊效果,下面就是一些常见的方式或者说工具。

0. Core Image

作为设计和体验方面的领导者,苹果自己对图片效果和图片处理的支持一定是非常好的,在iOS平台上,5.0之后就出现了Core Image的API。Core Image的API被放在CoreImage.framework库中。

在iOS和OS X平台上,Core Image都提供了大量的滤镜(Filter),这也是Core Image库中比较核心的东西之一。按照官方文档记载,在OS X上有120多种Filter,而在iOS上也有90多。

下面是一段Core Image做模糊的示例代码:


1

2

3

4

5

6

7

8

CIContext *context = [CIContext contextWithOptions:nil];

CIImage *image = [CIImage imageWithContentsOfURL:imageURL];

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

[filter setValue:image forKey:kCIInputImageKey];

[filter setValue:@2.0f forKey: @"inputRadius"];

CIImage *result = [filter valueForKey:kCIOutputImageKey];

CGImageRef outImage = [context createCGImage: result fromRect:[result extent]];

UIImage * blurImage = [UIImage imageWithCGImage:outImage];

这里可以看到,Core Image为了做得比较灵活,Filter都是按字符串的名字去创建的,比如高斯模糊滤镜就是“CIGaussianBlur”,这里有一个官方列表可以参看。

除了这里提到的多种Filter之外,Core Image还提供了CIDetector等类,可以支持人脸识别等,在OS X上Core Image也做了更多支持。

1. GPUImage

除了苹果官方提供的之外,第三方也有这方面图片处理的工具。一个叫Brad Larson的老兄就搞了一套叫做GPUImage的开源库。同样的,里面提供了很多Filter。

同样是做高斯模糊,用GPUImage可以这样:


1

2

3

4

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

blurFilter.blurRadiusInPixels = 2.0;

UIImage * image = [UIImage imageNamed:@"xxx"];

UIImage *blurredImage = [blurFilter imageByFilteringImage:image];

至少看起来,代码上比使用Core Image的情况简单得多。

2. vImage

其实,说完上面的Core Image和GPUImage,很多情况下就已经足够用了。下面我们再来看一个,那就是vImage。vImage也是苹果推出的库,在Accelerate.framework中。

Accelerate这个framework主要是用来做数字信号处理、图像处理相关的向量、矩阵运算的库。我们可以认为我们的图像都是由向量或者矩阵数据构成的,Accelerate里既然提供了高效的数学运算API,自然就能方便我们对图像做各种各样的处理。

基于vImage我们可以根据图像的处理原理直接做模糊效果,或者使用现有的工具。UIImage+ImageEffects是个很好的图像处理库,看名字也知道是对UIImage做的分类扩展。这个工具被广泛地使用着。

3. 性能与选择

既然已经知道了3个方法做到半透明模糊效果,那么我们要用的时候应该选择哪个呢?这是个问题。

从系统版本的支持上来看,这几个都差不多,都是iOS4、iOS5就支持了的,对于身在iOS8时代的开发者,这点兼容已经够了。

Core Image是苹果自己的图像处理库,本来就不错,如果苹果自身在某个版本做了优化处理,自然更好。主要是用起来比较麻烦,还要知道Filter的名字。

GPUImage来自第三方,但实现开放,用起来也比较简单,在很多场景下是由于Core Image的选择。

图像模糊处理是很复杂的计算,最终往往要看性能。这点上看,我更倾向选择vImage。

在本人开发的iOS应用中,选择了vImage,出发点是性能,这并不是说有非常精确的benchmark。但在几个调试时的主流机型上测,包括5c、5s等,在模糊半径(blur radius)达到10左右的时候,配合动画,vImage的处理时间会明显比较短,不会“卡顿”。

以上是本人对iOS上实现半透明模糊效果实现的整理。

时间: 2024-11-04 14:01:09

iOS开发使用半透明模糊效果方法整理的相关文章

【转载】iOS开发使用半透明模糊效果方法整理

[转载自 http://www.cocoachina.com/ios/20141223/10731.html] 虽然iOS很早就支持使用模糊效果对图片等进行处理,但尤其在iOS7以后,半透明模糊效果得到大范围广泛使用.包括今年最新发布的iOS8也沿袭了这一设计,甚至在OS X 10.10版Yosemite中也开始大量使用半透明模糊. 在iOS开发当中,我们有很多选择可以做半透明模糊效果,下面就是一些常见的方式或者说工具. 0. Core Image 作为设计和体验方面的领导者,苹果自己对图片效果

IOS开发之——四种方法解析Jason数据(转)

本文将介绍TouchJson. SBJson .JSONKit 和 iOS5所支持的原生的json方法,解析国家气象局API,TouchJson和SBJson需要下载他们的库 TouchJson包下载: http://download.csdn.net/detail/enuola/4523169 SBJson 包下载: http://download.csdn.net/detail/enuola/4523177 JSONKit包下载:http://download.csdn.net/detail

IOS开发中重写init方法使用需谨慎

IOS开发中重写init方法使用需谨慎 今天在写一个小软件的时候出现一点问题,这个软件的功能是搜索全国学校,首页就是搜索输入框,在框中输入完要查询的学校所在省份,点击buttom后就会跳转到对应的视图控制器中,然后把搜索结果呈现在一个TableView上,但是我在调试时,每次输入完然后点击搜索按钮时,弹出结果列表总是空的,我需要返回到首页再点击一次搜索才会出现结果,而且我在首页更改搜索关键字之后,点击搜索,结果还是上次的搜索结果,必须返回点击一次才会出现这次的搜索结果. 经过大神指点,原来这个问

iOS开发-图片高斯模糊效果

http://www.cnblogs.com/xiaofeixiang/p/5129074.html iOS开发的时候有的时候需要将图片设置模糊,或者通过点击下拉方法,去除模糊,一切都是为了应用更受用户欢迎,iOS7之后半透明模糊效果得到大范围使用的比较大,现在也可以看到很多应用局部用到了图片模糊效果,关于图片实现高斯模糊效果有三种方式,CoreImage,GPUImage(第三方开源类库)和vImage.GPUImage没怎么用过,本文就讲两种方式Core Image和vImage. Core

iOS开发UITableView基本使用方法总结

本文为大家呈现了iOS开发中UITableView基本使用方法总结.首先,Controller需要实现两个delegate ,分别是UITableViewDelegate 和UITableViewDataSource:然后 UITableView对象的 delegate要设置为 self:然后就可以实现这些delegate的一些方法拉. UITableView基本使用方法 1.首先,Controller需要实现两个delegate ,分别是UITableViewDelegate 和UITable

IOS开发--常用工具类收集整理(Objective-C)(持续更新)

前言:整理和收集了IOS项目开发常用的工具类,最后也给出了源码下载链接. 1.让图片不要渲染的工具类 简介:   直接看这个工具类的源码就知道,怎么设置了: 1 // 2 // UIImage+Render.h 3 // Created by HeYang on 16/1/18. 4 // Copyright © 2016年 HeYang. All rights reserved. 5 // 6 7 #import <UIKit/UIKit.h> 8 9 @interface UIImage

iOS开发-OC篇 load方法 和 initialize方法比较

Load方法 和 initialize方法的比较    在OC语言中,我们相比之下对于load和initialize方法的使用比较少,所以会不是很清楚的了解二者的用途和区别,所以整理了一下,和大家进行分享,有所得不对的地方,希望能够指出来,多谢! 1.load方法特点: 1> 当类被引用进程序的时候会执行这个函数 2> 一个类的load方法不用写明[super load],父类就会收到调用,并且在子类之前. 3> Category的load也会收到调用,但顺序上在主类的load调用之后.

【iOS开发系列】NSObject方法介绍

NSObject是OC中的基类,全部类都继承于此,这里面也给我们提供了非常多与"类"和"方法"相关的方法,本文将解说几个非常有用的方法. 正文: Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @end</span> Student.h #import "Person.h" // 继承Person类 @interface Stu

IOS开发 清空数组正确方法

NSArray以及NSMutableArray 在Objc中的两种数组(不可变数组和可变数组), 在日常开发中,经常会遇到需要清空数组的情况,很多人下意识的会想到nil这个方法,这里是不提倡的.因为如果使用 Array == nil:这样不仅清空了数组,同时也把memory释放了,这个object就不存在了.在清空数组时,千万不要这样做. 正确的做法是 利用removeAllObjects; 这样就可以得到想要的效果了 使用nil将会删除整个数组,而使用removeAllObjects仅仅是删除