服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS开发之图片模糊效果的五种实现代码

iOS开发之图片模糊效果的五种实现代码

2021-03-13 16:47绿豆粥与茶叶蛋 IOS

本篇文章主要介绍了iOS开发之模糊效果的五种实现代码。本文针对这五种方式讲解一下具体的实现,有兴趣的同学可以一起来了解一下

前言

在ios开发中我们经常会用到模糊效果使我们的界面更加美观,而ios本身也提供了几种达到模糊效果的api,如:core image,使用accelerate.framework中的vimage api,在ios 7之前系统的类提供uitoolbar,在ios 8之后苹果新增加的一个类uivisualeffectview;另外也有一些牛人写的第三方框架,如:gpuimage。本篇就针对这五种方式讲解一下具体的实现。

iOS开发之图片模糊效果的五种实现代码

正文

下面就按照这五种方式,将其实现模糊效果的具体实现一一讲解一下:

在ios 7之前系统的类提供uitoolbar来实现毛玻璃效果:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
- (void)toolbarstyle{
 
 cgrect toolbarrect = cgrectmake(0, 0,screenw/2,screenh);
 uitoolbar *toolbar = [[uitoolbar alloc] initwithframe:toolbarrect];
 /*
  * uibarstyledefault   = 0,
  * uibarstyleblack   = 1,
  * uibarstyleblackopaque  = 1, // deprecated. use uibarstyleblack
  * uibarstyleblacktranslucent = 2, // deprecated. use uibarstyleblack and set the translucent property to yes
  */
 toolbar.barstyle = uibarstyleblack;
 
 [self.myimageview addsubview:toolbar];
}

在ios 8之后苹果新增加了一个类uivisualeffectview,通过这个类来实现毛玻璃效果:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- (void)uivisualeffectviewstyle{
 /* ns_enum_available_ios(8_0)
  * uiblureffectstyleextralight,//额外亮度,(高亮风格)
  * uiblureffectstylelight,//亮风格
  * uiblureffectstyledark,//暗风格
  * uiblureffectstyleextradark __tvos_available(10_0) __ios_prohibited __watchos_prohibited,
  * uiblureffectstyleregular ns_enum_available_ios(10_0), // adapts to user interface style
  * uiblureffectstyleprominent ns_enum_available_ios(10_0), // adapts to user interface style
 
  */
 //实现模糊效果
 uiblureffect *effect = [uiblureffect effectwithstyle:uiblureffectstyledark];
 //毛玻璃视图
 uivisualeffectview *effectview = [[uivisualeffectview alloc] initwitheffect:effect];;
 effectview.frame = cgrectmake(0, 0, screenw/2, screenh);
 
 [self.myimageview addsubview:effectview];
}

ios5.0之后就出现了core image的api,core image的api被放在coreimage.framework库中, 在ios和os x平台上,core image都提供了大量的滤镜(filter),在os x上有120多种filter,而在ios上也有90多,core image设置模糊之后会在周围产生白边:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- (uiimage *)coreblurimage:(uiimage *)image withblurnumber:(cgfloat)blur{
 
 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;
 
}

gpuimage的开源库实现毛玻璃效果:

?
1
2
3
4
5
6
7
8
- (uiimage *)gpuimagestylewithimage:(uiimage *)image{
 
 gpuimagegaussianblurfilter *filter = [[gpuimagegaussianblurfilter alloc] init];
 filter.blurradiusinpixels = 10.0;//值越大,模糊度越大
 uiimage *blurimage = [filter imagebyfilteringimage:image];
 return blurimage;
 
}

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
- (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;
 
}

源码已上传至fenglinyunshi-git,并提出宝贵意见。

结语

uivisualeffectview技术是从ios8之后引进的,原理是在图片上方生成一个蒙层,若最低适配ios8的话可以考虑采取这个,运用uiblureffect是可逆的,我们可以去掉蒙层,显示图片;

?
1
[effectview removefromsuperview];
  1. ios 7之前系统的类提供的uitoolbar,原理也是在图片上方生成一个蒙层。
  2. 利用coreimage 进行模糊处理,是非常消耗cpu性能的;
  3. gpuimage的开源库实现毛玻璃效果也比较吃内存,相对core image好一点;
  4. 图像模糊处理属于复杂的计算,大部分图片模糊选择的是vimage,性能最佳。

uitoolbar和uiblureffect都是在图片上方生成一个蒙层,都可以设置模糊的范围;而其他三种方式都是对原来的图片进行模糊处理返回渲染后的一整张图片,相对来说比较耗性能。图1-2 是实测五种方式的内存占用:

iOS开发之图片模糊效果的五种实现代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://www.jianshu.com/p/902b0c2cca17

延伸 · 阅读

精彩推荐
  • IOSxcode8提交ipa失败无法构建版本问题的解决方案

    xcode8提交ipa失败无法构建版本问题的解决方案

    xcode升级到xcode8后发现构建不了新的版本。怎么解决呢?下面小编给大家带来了xcode8提交ipa失败无法构建版本问题的解决方案,非常不错,一起看看吧...

    Cinna丶7542021-02-03
  • IOSiOS逆向教程之logify跟踪方法的调用

    iOS逆向教程之logify跟踪方法的调用

    这篇文章主要给大家介绍了关于iOS逆向教程之logify跟踪方法调用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学...

    Mr.Guo11472021-04-28
  • IOSIOS网络请求之AFNetWorking 3.x 使用详情

    IOS网络请求之AFNetWorking 3.x 使用详情

    本篇文章主要介绍了IOS网络请求之AFNetWorking 3.x 使用详情,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    总李写代码6892021-03-04
  • IOSiOS APP实现微信H5支付示例总结

    iOS APP实现微信H5支付示例总结

    这篇文章主要介绍了iOS APP实现微信H5支付示例总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下...

    一张小A11332021-06-01
  • IOSiOS常见的几个修饰词深入讲解

    iOS常见的几个修饰词深入讲解

    这篇文章主要给大家介绍了关于iOS常见的几个修饰词的相关资料,iOS修饰词包括assign、weak、strong、retain、copy、nonatomic、atomic、readonly、readwrite,文中通过示...

    郡王丶千夜7422021-05-10
  • IOSiOS10 Xcode8适配7个常见问题汇总

    iOS10 Xcode8适配7个常见问题汇总

    这篇文章主要为大家详细汇总了iOS10 Xcode8适配7个常见问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    索马里猫10332021-02-01
  • IOS谈一谈iOS单例模式

    谈一谈iOS单例模式

    这篇文章主要和大家谈一谈iOS中的单例模式,单例模式是一种常用的软件设计模式,想要深入了解iOS单例模式的朋友可以参考一下...

    彭盛凇11872021-01-19
  • IOSiOS中时间与时间戳的相互转化实例代码

    iOS中时间与时间戳的相互转化实例代码

    这篇文章主要介绍了iOS中时间与时间戳的相互转化实例代码,非常具有实用价值,需要的朋友可以参考下。...

    张无忌!4812021-03-09