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

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

延伸 · 阅读

精彩推荐
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28