App设计时往往会用到一些模糊效果或者毛玻璃效果,iOS目前已提供一些模糊API可以让我们方便是使用。

话说苹果在iOS7.0之后,很多系统界面都使用了毛玻璃效果,增加了界面的美观性,比如下图的通知中心界面;

但是其iOS7.0的SDK并没有提供给开发者实现毛玻璃效果的API,所以很多人都是通过一些别人封装的框架来实现,后面我也会讲到一个;

其实在iOS7.0(包括)之前还是有系统的类可以实现毛玻璃效果的, 就是 UIToolbar这个类,并且使用相当简单,几行代码就可以搞定.

下面是代码实现:

创建一个UIToolbar实例,设置它的frame或者也可以通过添加约束

然后UIToolbar有一个属性:barStyle,设置对应的枚举值来呈现毛玻璃的样式,最后再添加到需要进行毛玻璃效果的view上即可.

/*

毛玻璃的样式(枚举)

UIBarStyleDefault = ,

UIBarStyleBlack = ,

UIBarStyleBlackOpaque = , // Deprecated. Use UIBarStyleBlack

UIBarStyleBlackTranslucent = , // Deprecated. Use UIBarStyleBlack and set the translucent property to YES

*/

UIImageView *bgImgView = [[UIImageView alloc] initWithFrame:self.view.bounds];

bgImgView.image = [UIImage imageNamed:@"huoying.jpg"];

[self.view addSubview:bgImgView];

UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(, , bgImgView.frame.size.width*., bgImgView.frame.size.height)];

toolbar.barStyle = UIBarStyleBlackTranslucent;

[bgImgView addSubview:toolbar];

效果图:

我们再来看看视图结构:

通过视图结构可以看到UIToolbar包含了三个子视图

一个背景图片和1个背景view,还有1个背景特效view,正是这几个视图结合在一起实现了毛玻璃的效果

在iOS8.0之后,苹果新增了一个类UIVisualEffectView,通过这个类来实现毛玻璃效果与上面的UIToolbar一样,而且效率也非常之高,使用也是非常简单,几行代码搞定. UIVisualEffectView是一个抽象类,不能直接使用,需通过它下面的三个子类来实现(UIBlurEffect, UIVisualEffevt, UIVisualEffectView);

子类UIBlurEffect只有一个类方法,用来快速创建一个毛玻璃效果,参数是一个枚举,用来设置毛玻璃的样式,而UIVisualEffectView则多了两个属性和两个构造方法,用来快速将创建的毛玻璃添加到这个UIVisualEffectView上.

特别注意: 这个类是iOS8.0之后才适用, 所以如果项目要兼容iOS7.0的话, 还是要考虑其它的两种方法了.

下面来看看实现代码:

同样是先快速的实例化UIBlurEffect并设置毛玻璃的样式,然后再通过UIVisualEffectView的构造方法将UIBlurEffect的实例添加上去最后设置frame或者是通过添加约束, 将effectView添加到要实现了毛玻璃的效果的view控件上,效果图和上面的一样.

UIImageView *bgImgView = [[UIImageView alloc] initWithFrame:self.view.bounds];

bgImgView.image = [UIImage imageNamed:@"huoying.jpg"];

bgImgView.contentMode = UIViewContentModeScaleAspectFill;

//[bgImgView setImageToBlur: [UIImage imageNamed:@"huoying.jpg"] blurRadius: completionBlock:nil];

bgImgView.userInteractionEnabled = YES;

[self.view addSubview:bgImgView];

/*

毛玻璃的样式(枚举)

UIBlurEffectStyleExtraLight,

UIBlurEffectStyleLight,

UIBlurEffectStyleDark

*/

UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];

UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect];

effectView.frame = CGRectMake(, , bgImgView.frame.size.width*., bgImgView.frame.size.height);

[bgImgView addSubview:effectView];

但是我们来看看视图结构,大家会发现和Toolbar不一样哦!

其实是因为UIVisualEffectView这个类,构造方法帮我们创建了一个view,而这个view我们给它做了毛玻璃处理,再将其覆盖到了背景图之上

嗯! 最后再来给大家介绍一个国外大神封装的UIImageView的分类,里面不管是怎么实现的,反正使用非常简单,只要一句代码就搞定.

下面先看代码:

UIImageView *bgImgView = [[UIImageView alloc] initWithFrame:self.view.bounds];

//bgImgView.image = [UIImage imageNamed:@"huoying.jpg"];

bgImgView.contentMode = UIViewContentModeScaleAspectFill;

// 对背景图片进行毛玻璃效果处理 参数blurRadius默认是,可指定,最后一个参数block回调可以为nil

[bgImgView setImageToBlur: [UIImage imageNamed:@"huoying.jpg"] blurRadius: completionBlock:nil];

bgImgView.userInteractionEnabled = YES;

[self.view addSubview:bgImgView];

效果图:

再来看看添加毛玻璃效果后的视图结构:

哈哈哈, 大家应该看懂了, 这是直接对背景图片进行了高斯模糊处理了,其它就不解释了.

好啦, 反正iOS中要进行毛玻璃效果处理就这几种方式,看大家的需求,喜欢用哪种就用哪种吧.

上面的demo,包括大神封装的分类,如果需要详细的源代码的话,可以到我的gitHub上Clone啦!有问题欢迎留言一起探讨学习.

下面给大家介绍图片模糊效果的三种方法

第一种使用Core Image进行模糊

- (UIImage *)blurryImage:(UIImage *)image

withBlurLevel:(CGFloat)blur {

CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage];

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

keysAndValues:kCIInputImageKey, inputImage,

@"inputRadius", @(blur),

]; CIImage *outputImage = filter.outputImage;

CGImageRef outImage = [self.context createCGImage:outputImage

fromRect:[outputImage extent]];

return [UIImage imageWithCGImage:outImage]; }

第二种使用vImage API进行模糊

- (UIImage *)blurryImage:(UIImage *)image withBlurLevel:(CGFloat)blur {

if (blur < 0.f || blur > 1.f) {

blur = 0.5f;

}

int boxSize = (int)(blur * 100);

boxSize = boxSize - (boxSize % 2) + 1;

CGImageRef img = image.CGImage;

vImage_Buffer inBuffer, outBuffer;

vImage_Error error;

void *pixelBuffer;

CGDataProviderRef inProvider = CGImageGetDataProvider(img);

CFDataRef inBitmapData = http://www.open-open.com/code/view/CGDataProviderCopyData(inProvider);

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

第三种方法是网上找到的(毛玻璃效果)

// 内部方法,核心代码,封装了毛玻璃效果 参数:半径,颜色,色彩饱和度- (UIImage *)imageBluredWithRadius:(CGFloat)blurRadius tintColor:(UIColor *)tintColor saturationDeltaFactor:(CGFloat)saturationDeltaFactor maskImage:(UIImage *)maskImage {

CGRect imageRect = { CGPointZero, self.size };

UIImage *effectImage = self; BOOL hasBlur = blurRadius > __FLT_EPSILON__;

BOOL hasSaturationChange = fabs(saturationDeltaFactor - 1.) > __FLT_EPSILON__; if (hasBlur || hasSaturationChange) { UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]);

CGContextRef effectInContext = UIGraphicsGetCurrentContext();

CGContextScaleCTM(effectInContext, 1.0, -1.0);

CGContextTranslateCTM(effectInContext, 0, -self.size.height);

CGContextDrawImage(effectInContext, imageRect, self.CGImage);

vImage_Buffer effectInBuffer; effectInBuffer.data = http://www.open-open.com/code/view/CGBitmapContextGetData(effectInContext);

effectInBuffer.width = CGBitmapContextGetWidth(effectInContext);

effectInBuffer.height = CGBitmapContextGetHeight(effectInContext);

effectInBuffer.rowBytes = CGBitmapContextGetBytesPerRow(effectInContext);

UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]);

CGContextRef effectOutContext = UIGraphicsGetCurrentContext();

vImage_Buffer effectOutBuffer;

effectOutBuffer.data = CGBitmapContextGetData(effectOutContext);

effectOutBuffer.width = CGBitmapContextGetWidth(effectOutContext);

effectOutBuffer.height = CGBitmapContextGetHeight(effectOutContext);

effectOutBuffer.rowBytes = CGBitmapContextGetBytesPerRow(effectOutContext); if (hasBlur) { CGFloat inputRadius = blurRadius * [[UIScreen mainScreen] scale];

NSUInteger radius = floor(inputRadius * 3. * sqrt(2 * M_PI) / 4 + 0.5);

if (radius % 2 != 1) {

radius += 1; // force radius to be odd so that the three box-blur methodology works.

}

vImageBoxConvolve_ARGB8888(&effectInBuffer, &effectOutBuffer, NULL, 0, 0, (short)radius, (short)radius, 0, kvImageEdgeExtend); vImageBoxConvolve_ARGB8888(&effectOutBuffer, &effectInBuffer, NULL, 0, 0, (short)radius, (short)radius, 0, kvImageEdgeExtend); vImageBoxConvolve_ARGB8888(&effectInBuffer, &effectOutBuffer, NULL, 0, 0, (short)radius, (short)radius, 0, kvImageEdgeExtend);

}

BOOL effectImageBuffersAreSwapped = NO;

if (hasSaturationChange) {

CGFloat s = saturationDeltaFactor;

CGFloat floatingPointSaturationMatrix[] = {

0.0722 + 0.9278 * s, 0.0722 - 0.0722 * s, 0.0722 - 0.0722 * s,

0,

0.7152 - 0.7152 * s, 0.7152 + 0.2848 * s, 0.7152 - 0.7152 * s,

0,

0.2126 - 0.2126 * s, 0.2126 - 0.2126 * s, 0.2126 + 0.7873 * s,

0,

0,

0,

0,

1,

};

const int32_t divisor = 256;

NSUInteger matrixSize = sizeof(floatingPointSaturationMatrix)/sizeof(floatingPointSaturationMatrix[0]); int16_t saturationMatrix[matrixSize]; for (NSUInteger i = 0; i < matrixSize; ++i) {

saturationMatrix[i] = (int16_t)roundf(floatingPointSaturationMatrix[i] * divisor);

}

if (hasBlur) {

vImageMatrixMultiply_ARGB8888(&effectOutBuffer, &effectInBuffer, saturationMatrix, divisor, NULL, NULL, kvImageNoFlags);

effectImageBuffersAreSwapped = YES;

}

else {

vImageMatrixMultiply_ARGB8888(&effectInBuffer, &effectOutBuffer, saturationMatrix, divisor, NULL, NULL, kvImageNoFlags);

}

}

if (!effectImageBuffersAreSwapped)

effectImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

if (effectImageBuffersAreSwapped)

effectImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

}

// 开启上下文 用于输出图像

UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]);

CGContextRef outputContext = UIGraphicsGetCurrentContext();

CGContextScaleCTM(outputContext, 1.0, -1.0);

CGContextTranslateCTM(outputContext, 0, -self.size.height);

// 开始画底图 CGContextDrawImage(outputContext, imageRect, self.CGImage);

// 开始画模糊效果

if (hasBlur)

{

CGContextSaveGState(outputContext);

if (maskImage)

{

CGContextClipToMask(outputContext, imageRect, maskImage.CGImage);

} CGContextDrawImage(outputContext, imageRect, effectImage.CGImage);

CGContextRestoreGState(outputContext);

}

// 添加颜色渲染

if (tintColor)

{

CGContextSaveGState(outputContext);

CGContextSetFillColorWithColor(outputContext, tintColor.CGColor);

CGContextFillRect(outputContext, imageRect);

CGContextRestoreGState(outputContext);

}

// 输出成品,并关闭上下文

UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return outputImage;}

java 图片实现毛玻璃_iOS毛玻璃效果的实现及图片模糊效果的三种方法相关推荐

  1. java arrayadapter_「arrayadapter」Android之ArrayAdapter(数组适配器)的三种方法 - seo实验室...

    arrayadapter arrayadapter数组适配器用于绑定格式单一的数据,数据源可以是集合或者数组 列表视图(listview)以垂直的形式列出需要显示的列表项. 实现过程:新建适配器-&g ...

  2. java输出数组中的元素_Java快捷输出数组元素的三种方法

    1.简介 Java中快捷输出数组中各个元素笔者目前所知的就三种方法,今天就简单的做个记录.大家如果有什么更好的方法,麻烦留言评论. 2.代码 public class ArrayPrint { pub ...

  3. 瀑布流效果,用女神图片用三种方法实现,比在浏览器看过瘾,哈哈哈

    第一种方法:采用纯CSS的"多列"属性 实现瀑布流用到的一些多列属性: 1. column-count:指定元素的列数 2. column-gap:指定列之间的差距 3. colu ...

  4. java中像scanf一样多个输入_VB模拟键盘输入的N种方法

    VB模拟键盘输入的N种方法http://bbs.csdn.net/topics/90509805hd378发表于: 2006-12-24 14:35:39用VB模拟键盘事件的N种方法 键盘是我们使用计 ...

  5. java生成验证码的三种方法

    java生成验证码的三种方法 第一种:导入jar包com.github.axet生成法 ①导包 <dependency><groupId>com.github.axet< ...

  6. 测试Python下载图片的三种方法

    简 介: 通过Python软件包对网络URL图片链接进行下载,可以加快后期处理.本文测试了urllib, request两个软件包对图片进行下载效果.如果图片原网页有了防止下载机制,是无法下载图片. ...

  7. java se 定时任务_Java实现定时任务的三种方法

    一.Quartz的特点 按作业类的继承方式来分,主要有以下两种: 作业类继承org.springframework.scheduling.quartz.QuartzJobBean类的方式作业类不继承o ...

  8. Eclipse远程调试Java代码的三种方法

    Eclipse远程调试Java代码的三种方法, 第1种方法是用来调试已经启动的Java程序,Eclipse可以随时连接到远程Java程序进行调试, 第2种方法可以调试Java程序启动过程,但是Ecli ...

  9. 如何放大图片,教您三种方法!

    在日常生活中,我们经常会对一些尺寸不符合的照片进行放大处理,在这里我们就需要一些特殊的方法,接下来我们介绍三种方法. 最懒的方法:直接拉伸小图截取 简易程度:★★★★★ 图片质量:★ 适用人群:只需要 ...

  10. Java程序初始化启动自动执行的三种方法

    目录 @PostConstruct注解 CommandLineRunner接口 ApplicationRunner 接口 @Order注解设置启动顺序 分享一下自己用过的java程序初始化启动自动执行 ...

最新文章

  1. SQL Server索引设计 第五篇
  2. 64位环境编译DiskSim 4.0
  3. .NET Core 3.0 Preview 6中对ASP.NET Core和Blazor的更新
  4. Linux - Sysstat [ All-in-One System Performance and Usage Activity Monitoring Tool For Linux]
  5. java自学之路-day17
  6. PhpStorm11.0 配置在浏览器中打开文件
  7. nfs挂载在centos6后注意
  8. Alice and Bob
  9. TypeError: ‘builtin_function_or_method‘ object is not subscriptable 报错解决方法
  10. KNN(一)--简单KNN原理及实现
  11. android适配各种分辨率的问题
  12. 服务注册中心---服务发现nacos
  13. win10外放与耳机不能够自动切换没有声音的问题 声卡问题
  14. java 调用 fastreport,Winform中使用FastReport实现简单的自定义PDF导出
  15. Python3网络爬虫教程7——SSL数字证书
  16. RegistryKey类的学习(转载)
  17. 5G NR MCG,SCG,PCell,PSCell,SCell,sPCell 概念
  18. Nginx 配置问题 server directive is not allowed here in /etc/nginx/nginx.conf:69
  19. js逆向破解 —— 懂车帝视频链接
  20. BLE MESH组网(四)安全概述

热门文章

  1. openstack云计算平台 1(认证服务、镜像服务)
  2. 常见时序算法集合【资源整理】
  3. vb如何调用计算机日历,跪求vb.net简易日历制作的源代码
  4. 企业终端病毒查杀+漏洞及补丁管理(自写知识分享,不是广告)
  5. 康诺特酒吧摘得2021全球50家最佳酒吧桂冠;华住与京能集团达成战略合作 | 全球旅报...
  6. 第13章WEB13-JSP模式JDBC高级篇
  7. java愤怒的小鸟教学_JAVA课程设计——愤怒的小鸟(团队)
  8. SPIR-V 研究:编译器基本原理(三) - Chomsky文法分类
  9. Extraneous non-emits event listeners (xxxXxx) were passed to component but could not be automaticall
  10. Intellij IDEA设置类的文件头注释(@Author)(一)