模糊效果,顾名思义,是将你的背景图片进行虚化,模糊,进而在背景图片上增加一些不虚化,不模糊的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,十分感谢.在这里加上注释,与大家分享.
// 创建需要的毛玻璃特效类型
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
CentOS 6.4和Eclipse Juno CDT(4.2.2)的bug
cygwin/X XDMCP连接CentOS
手把手教你emacs cedet C/C++自动补全
ProFont – 识别度极高的终端字体
ACE之旅——环境搭建、HelloWorld
静态链表在优化中的应用
ACE之旅——第一个ACE通讯程序daytime
ThinkPHP 自定义标签测试 冰糖
FreeTextBox使用详解 (版本3.1.1)
- 最新文章
-
POJ 2362 Sqare【DFS】
POJ 3258 \poj 3273\poj 3122 【二分】
【转】图的点连通度边连通度总结
背包问题POJ 1252 Euro Efficiency【完全背包】
POJ 2676 Sudoku【DancingLinks,数独】
HDU 3473 Minimum Sum【划分树】
POJ 1681 Painter's Problem【状态压缩,枚举】
POJ 3067 Japan【一维树状数组】
背包问题POJ 3260 The Fewest Coins【完全背包+多重背包】
POJ 3740 Easy Finding【Dancinglinks】