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

摘要:
GPUImage并没有被大量使用。本文介绍了两种方法:CoreImage和vImage。在CoreImage开始下载代码之前,让我们看看实现效果:在iOS 5.0之后,CoreImageAPI出现,CoreIImage API被放置在CoreIImage中。在框架库中,CoreIimage在iOS和OSX平台上提供了大量过滤器,包括OSX上的120多个过滤器和iOS上的90多个过滤器。首先,让我们展开UIImage,添加类方法:12345678910111213141516+coreBlurImage:imagewithBlurNumber:blur{//Blog Garden FlyElephantCIContext*context=[ContextcontextWithOptions:nil];CIImage*inputImage=[CImageimageWithCGImage:image.CGImage];//设置filterCIFilter*filter=[CIFilterWithName:@“CIGaussianBlur”];[filtersetValue:inputImageforKey:kCIInputImageKey];[footersetValue:@forKey:@“inputRadius”] ;// 模糊图片CIImage*result=[filtervalueForKey:kCIOutputImageKey];CGImageRefoutImage=[contextcreateCGImage:resultfromRect:[resultextent]];UIImage*blurImage=[UIImageimageWithCGImage:outImage];CGImageRelease;returnblurImage;}过滤选项设置为高斯模糊:vImage属于Accelerate Framework,您需要在Accelerate下导入Accelerate头文件,该文件主要用于执行与数字信号处理和图像处理相关的矢量和矩阵操作。

http://www.cnblogs.com/xiaofeixiang/p/5129074.html

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

Core  Image

开始撸代码之前我们先来看一下实现的效果:

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

iOS5.0之后就出现了Core Image的API,Core Image的API被放在CoreImage.framework库中,在iOS和OS X平台上,Core Image都提供了大量的滤镜(Filter),在OS X上有120多种Filter,而在iOS上也有90多。首先我们扩展一下UIImage,添加类方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
+(UIImage *)coreBlurImage:(UIImage *)image
           withBlurNumber:(CGFloat)blur {
    //博客园-FlyElephant
    CIContext *context = [CIContext contextWithOptions:nil];
    CIImage  *inputImage=[CIImage imageWithCGImage:image.CGImage];
    //设置filter
    CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
    [filter setValue:inputImage forKey:kCIInputImageKey];
    [filter setValue:@(blur) forKey: @"inputRadius"];
    //模糊图片
    CIImage *result=[filter valueForKey:kCIOutputImageKey];
    CGImageRef outImage=[context createCGImage:result fromRect:[result extent]];
    UIImage *blurImage=[UIImage imageWithCGImage:outImage];
    CGImageRelease(outImage);
    return blurImage;
}

其中过滤的选项设置为高斯模糊:

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

vImage 方式

vImage属于Accelerate.Framework,需要导入Accelerate下的Accelerate头文件,Accelerate主要是用来做数字信号处理、图像处理相关的向量、矩阵运算的库。图像可以认为是由向量或者矩阵数据构成的,Accelerate里既然提供了高效的数学运算API,自然就能方便我们对图像做各种各样的处理,模糊算法使用的是vImageBoxConvolve_ARGB8888这个函数。 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
+(UIImage *)boxblurImage:(UIImage *)image withBlurNumber:(CGFloat)blur {
    if (blur < 0.f || blur > 1.f) {
        blur = 0.5f;
    }
    int boxSize = (int)(blur * 40);
    boxSize = boxSize - (boxSize % 2) + 1;
     
    CGImageRef img = image.CGImage;
     
    vImage_Buffer inBuffer, outBuffer;
    vImage_Error error;
     
    void *pixelBuffer;
    //从CGImage中获取数据
    CGDataProviderRef inProvider = CGImageGetDataProvider(img);
    CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);
    //设置从CGImage获取对象的属性
    inBuffer.width = CGImageGetWidth(img);
    inBuffer.height = CGImageGetHeight(img);
    inBuffer.rowBytes = CGImageGetBytesPerRow(img);
     
    inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);
     
    pixelBuffer = malloc(CGImageGetBytesPerRow(img) *
                         CGImageGetHeight(img));
     
    if(pixelBuffer == NULL)
        NSLog(@"No pixelbuffer");
     
    outBuffer.data = pixelBuffer;
    outBuffer.width = CGImageGetWidth(img);
    outBuffer.height = CGImageGetHeight(img);
    outBuffer.rowBytes = CGImageGetBytesPerRow(img);
     
    error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);
     
    if (error) {
        NSLog(@"error from convolution %ld", error);
    }
     
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef ctx = CGBitmapContextCreate(
                                             outBuffer.data,
                                             outBuffer.width,
                                             outBuffer.height,
                                             8,
                                             outBuffer.rowBytes,
                                             colorSpace,
                                             kCGImageAlphaNoneSkipLast);
    CGImageRef imageRef = CGBitmapContextCreateImage (ctx);
    UIImage *returnImage = [UIImage imageWithCGImage:imageRef];
     
    //clean up
    CGContextRelease(ctx);
    CGColorSpaceRelease(colorSpace);
     
    free(pixelBuffer);
    CFRelease(inBitmapData);
     
    CGColorSpaceRelease(colorSpace);
    CGImageRelease(imageRef);
     
    return returnImage;
}

图片模糊调用:

1
2
3
4
5
self.imageView=[[UIImageView alloc]initWithFrame:CGRectMake(0, 300, SCREENWIDTH, 100)];
self.imageView.contentMode=UIViewContentModeScaleAspectFill;
self.imageView.image=[UIImage boxblurImage:self.image withBlurNumber:0.5];
self.imageView.clipsToBounds=YES;
[self.view addSubview:self.imageView];

关于两种方式的选择的建议

效果:第一种Core Image设置模糊之后会在周围产生白边,vImage使用不存在任何问题;

性能:图像模糊处理属于复杂的计算,大部分图片模糊选择的是vImage,性能最佳(没有亲自测试过,有兴趣可以自己测试)

项目地址:https://github.com/SmallElephant/iOS-UIImageBoxBlur

参考资料:https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIGaussianBlur

 

免责声明:文章转载自《iOS开发-图片高斯模糊效果》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇kettle启动时候报a fatal exception has occurredElasticsearch Java高级客户端下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ECSHOP模糊分词搜索和商品列表关键字飘红功能

ECSHOP联想下拉框 1、修改page_header.lbi模版文件,将搜索文本框修改为: <input name="keywords"type="text"id="keyword"value="<!--{if ($search_keywords neq "")}{$search_keywords|escape}--><!--...

iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)

本文链接:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-three.html 这里接着前文《iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)》,主要是干货环节,列举了如何基于 PhotoKit 与 AlAssetLibrary 封装出通用的方法...

虚拟机IOS开发环境搭建教程

来源:http://www.cnblogs.com/xiaoyaoju/archive/2013/05/21/3091171.html 安装条件: 硬件:一台拥有支持虚拟技术的64位双核处理器和2GB以上内存的PC。 注意:运行MAC OS,需要电脑支持虚拟技术(VT),安装时,需要将VT启动,在BIOS中开启。 关于如何检测你的电脑支持VT,可以去下面这...

IOS开发之--Xcode的简单使用

Xcode的简单使用 一、快捷键的使用 经常用到的快捷键如下: 新建 shift + cmd + n     新建项目 cmd + n             新建文件 视图 option + cmd + 回车 打开助理编辑器 cmd + 回车           显示主窗口 cmd + 0             导航窗口 option + cmd +...

iOS开发:常用的UIView控件——UILabel、UITextField、UIButton

前面几篇文章已经对iOS开发中比较基本的几个文件进行了了解,今天主要学习StoryBoard文件和几个常见的UI控件。 Storyboard功能是在iOS5开始新增的功能,一种新技术的出现大多是为了弥补旧技术的不足,而在storyboard之前iOS 开发设计界面是使用nib文件(xib),storyboard文件相对nib文件的好处主要体现在storyb...

IOS开发---菜鸟学习之路--(十四)-将BASE64图片转换成Image

本文基本全部都是代码 首先是.H文件 1 #import <Foundation/Foundation.h> 2 3 @interface Base64AndImageHelp : NSObject 4 - (NSString*)encodeURL:(NSString *)string; 5 +(id)mydataWithBase64Enc...