ios开发笔记-2-毛玻璃效果
2015-11-13 15:27
477 查看
模糊效果,顾名思义,是将你的背景图片进行虚化,模糊,进而在背景图片上增加一些不虚化,不模糊的button等等,从而达到一种吸引用户眼球的效果,通常称之为焦点效应.开发过程中,产生模糊效果的方法很多,下面为大家简单进行介绍.
1.最简单的方法.
你去找你的UI,设计一张毛玻璃效果的图片,贴上去,大功告成,模糊效果产生了.简单,易用.但是如果你想学习更多的知识,想通过代码的方式产生模糊效果,我们继续.
2.CoreImage.
coreImage是IOS5中新加入的一个Objective-c的框架,提供了强大高效的图像处理功能,用来对基于像素的图像进行操作与分析。iOS提供了很多强大的滤镜(Filter),现在有127种之多,随着框架的更新,这一数字会继续增加。这些Filter提供了各种各样的效果,并且还可以通过滤镜链将各种效果的Filter叠加起来,形成强大的自定义效果,如果你对该效果很满意,还可以子类化滤镜。下面将代码贴在下面,与大家分享,如果对框架不熟悉,建议阅读苹果的官方API.
CIContext *context = [CIContext contextWithOptions:nil];
CIImage *inputImage = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"detail@2x.png"]];
CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
[filter setValue:inputImage forKey:kCIInputImageKey];
[filter setValue:[NSNumber numberWithFloat:10.0] forKey:@"inputRadius"];
// CIImage *result = [filter valueForKey:kCIOutputImageKey];
CIImage *result=[filter outputImage];
CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];
UIImage *image = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
self.imgView.image=image;
简单易用,推荐使用
3.vImage
如果你对性能有极大的追求,那么vImage会适合你,iOS5.0中新增了vImage API可以使用,它属于Accelerate.Framework,所以如果你要使用它要在工程中加入这个Framework。模糊算法使用的是vImageBoxConvolve_ARGB8888这个函数.
- (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 = 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;
}
4.第三方库
可以在网上找到一些不错的第三方库,产生模糊效果.但是个人不推荐使用,断更永远是第三方库最大的诟病.
5.8.0新开放API
在评论区看到大神@ZweiZhao的代码,发现开放了新的API,十分感谢.在这里加上注释,与大家分享.
iOS 8 后更新的 UIBlurEffect类和 UIVisualEffectView类使这种特效应用更加便捷,高效.使用也非常简便,UIBlurEffect 类是设定毛玻璃特效的类型,UIVisualEffectView类在创建时加入上一个类对象,剩下的跟普通的view 控件等用法就一样了.
// 创建需要的毛玻璃特效类型
UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
// 毛玻璃view 视图
UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
//添加到要有毛玻璃特效的控件中
effectView.frame = self.imageV.bounds;
[self.imageV addSubview:effectView];
//设置模糊透明度
effectView.alpha = .8f;
http://blog.sina.cn/dpool/blog/s/blog_92ac2c5b0101cm5b.html?plg_nld=1&plg_uin=1&plg_auth=1&vt=4&plg_usr=1&plg_nld=1&plg_vkey=1&plg_dev=1 http://www.cnblogs.com/kenshincui/p/3959951.html
转载: Mr.林的博客
看到有人是这样做的
//添加毛玻璃
UIVisualEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
_xView = [[UIVisualEffectView alloc]initWithEffect:blurEffect];
_xView.frame= self.view.frame;
_xView.alpha = 0.7;
[_app.window addSubview:_xView];
1.最简单的方法.
你去找你的UI,设计一张毛玻璃效果的图片,贴上去,大功告成,模糊效果产生了.简单,易用.但是如果你想学习更多的知识,想通过代码的方式产生模糊效果,我们继续.
2.CoreImage.
coreImage是IOS5中新加入的一个Objective-c的框架,提供了强大高效的图像处理功能,用来对基于像素的图像进行操作与分析。iOS提供了很多强大的滤镜(Filter),现在有127种之多,随着框架的更新,这一数字会继续增加。这些Filter提供了各种各样的效果,并且还可以通过滤镜链将各种效果的Filter叠加起来,形成强大的自定义效果,如果你对该效果很满意,还可以子类化滤镜。下面将代码贴在下面,与大家分享,如果对框架不熟悉,建议阅读苹果的官方API.
CIContext *context = [CIContext contextWithOptions:nil];
CIImage *inputImage = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"detail@2x.png"]];
CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
[filter setValue:inputImage forKey:kCIInputImageKey];
[filter setValue:[NSNumber numberWithFloat:10.0] forKey:@"inputRadius"];
// CIImage *result = [filter valueForKey:kCIOutputImageKey];
CIImage *result=[filter outputImage];
CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];
UIImage *image = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
self.imgView.image=image;
简单易用,推荐使用
3.vImage
如果你对性能有极大的追求,那么vImage会适合你,iOS5.0中新增了vImage API可以使用,它属于Accelerate.Framework,所以如果你要使用它要在工程中加入这个Framework。模糊算法使用的是vImageBoxConvolve_ARGB8888这个函数.
- (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 = 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;
}
4.第三方库
可以在网上找到一些不错的第三方库,产生模糊效果.但是个人不推荐使用,断更永远是第三方库最大的诟病.
5.8.0新开放API
在评论区看到大神@ZweiZhao的代码,发现开放了新的API,十分感谢.在这里加上注释,与大家分享.
iOS 8 后更新的 UIBlurEffect类和 UIVisualEffectView类使这种特效应用更加便捷,高效.使用也非常简便,UIBlurEffect 类是设定毛玻璃特效的类型,UIVisualEffectView类在创建时加入上一个类对象,剩下的跟普通的view 控件等用法就一样了.
// 创建需要的毛玻璃特效类型
UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
// 毛玻璃view 视图
UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
//添加到要有毛玻璃特效的控件中
effectView.frame = self.imageV.bounds;
[self.imageV addSubview:effectView];
//设置模糊透明度
effectView.alpha = .8f;
http://blog.sina.cn/dpool/blog/s/blog_92ac2c5b0101cm5b.html?plg_nld=1&plg_uin=1&plg_auth=1&vt=4&plg_usr=1&plg_nld=1&plg_vkey=1&plg_dev=1 http://www.cnblogs.com/kenshincui/p/3959951.html
转载: Mr.林的博客
看到有人是这样做的
//添加毛玻璃
UIVisualEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
_xView = [[UIVisualEffectView alloc]initWithEffect:blurEffect];
_xView.frame= self.view.frame;
_xView.alpha = 0.7;
[_app.window addSubview:_xView];
相关文章推荐
- ios加解密
- ios开发笔记-1-tableView
- iOS/OS X内存管理(一):基本概念与原理
- ios客户端本地校验iap
- iOS通知NSNotification传值的使用
- IOS自定义打印日志
- 【iOS】导入openssl出现找不到文件的解决方法
- isIOS9
- 【iOS开发】更改来自友盟社会化组件
- iOS应用安全防护框架概述
- IOSFunction
- iOS二维码生成与扫描(zbar和原生AVFoundation)
- iOS8.0人性化的“通知中心”
- iOS- 利用AFNetworking(AFN) - 实现文件断点下载
- TextField和TextView字数超出截取问题
- iOS 游戏开发 博客
- iOS 开发笔记
- Xcode6版本iOS模拟器的相关路径
- iOS崩溃日志分析
- iOS tableView section 和cell 一同滚动的方法