iOS開發(fā)中有的時(shí)候需要將圖片設(shè)置模糊斟冕,來實(shí)現(xiàn)特定的效果獲取更好的用戶體驗(yàn), iOS7之后半透明模糊效果得到大范圍使用的比較大,現(xiàn)在也可以看到很多應(yīng)用局部用到了圖片模糊效果,可以通過高斯模糊和毛玻璃效果達(dá)到圖片模糊效果乍钻。
高斯模糊效果
1.** CoreImage: **
iOS5.0之后就出現(xiàn)了Core Image的API,Core Image的API被放在CoreImage.framework庫中, 在iOS和OS X平臺(tái)上,Core Image都提供了大量的濾鏡(Filter)铭腕,在OS X上有120多種Filter,而在iOS上也有90多多糠。
+(UIImage *)coreBlurImage:(UIImage *)image withBlurNumber:(CGFloat)blur
{
CIContext *context = [CIContext contextWithOptions:nil];
CIImage *inputImage= [CIImage imageWithCGImage:image.CGImage];
//設(shè)置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;
}
2.** vImage **
vImage屬于Accelerate.Framework累舷,需要導(dǎo)入 Accelerate下的 Accelerate頭文件, Accelerate主要是用來做數(shù)字信號(hào)處理夹孔、圖像處理相關(guān)的向量被盈、矩陣運(yùn)算的庫析孽。圖像可以認(rèn)為是由向量或者矩陣數(shù)據(jù)構(gòu)成的,Accelerate里既然提供了高效的數(shù)學(xué)運(yùn)算API只怎,自然就能方便我們對(duì)圖像做各種各樣的處理 袜瞬,模糊算法使用的是vImageBoxConvolve_ARGB8888這個(gè)函數(shù)。
+(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中獲取數(shù)據(jù)
CGDataProviderRef inProvider = CGImageGetDataProvider(img);
CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);
//設(shè)置從CGImage獲取對(duì)象的屬性
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;
}
方法調(diào)用
UIImageView *imageView=[[UIImageView alloc]initWithFrame:CGRectMake(0, 300, SCREENWIDTH, 100)];
imageView.contentMode=UIViewContentModeScaleAspectFill;
imageView.image=[UIImage boxblurImage:image withBlurNumber:0.5];
imageView.clipsToBounds=YES;
[self.view addSubview:imageView];
3.GPUImage
GPUImage是用設(shè)備的GPU來實(shí)時(shí)處理圖片身堡,給圖片加各種濾鏡效果的一個(gè)開源庫邓尤。
可以實(shí)時(shí)地給照相機(jī)加上濾鏡效果,很多App都支持這種實(shí)時(shí)濾鏡贴谎。
鏈接地址:https://github.com/BradLarson/GPUImage
區(qū)別:
效果:第一種Core Image設(shè)置模糊之后會(huì)在周圍產(chǎn)生白邊汞扎,vImage使用不存在任何問題;
性能:圖像模糊處理屬于復(fù)雜的計(jì)算擅这,大部分圖片模糊選擇的是vImage澈魄,性能最佳
項(xiàng)目地址: https://github.com/524429264/iOS-UIImageBoxBlur
參考資料:https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIGaussianBlur
毛玻璃效果
- 蘋果在iOS7.0之后,很多系統(tǒng)界面都使用了毛玻璃效果,增加了界面的美觀性,比如通知中心界面;其實(shí)在iOS7.0(包括)之前還是有系統(tǒng)的類可以實(shí)現(xiàn)毛玻璃效果的, 就是 UIToolbar這個(gè)類
iOS7.0
毛玻璃的樣式(枚舉)
UIBarStyleDefault = 0,
UIBarStyleBlack = 1,
UIBarStyleBlackOpaque = 1, // Deprecated. Use UIBarStyleBlack
UIBarStyleBlackTranslucent = 2, // Deprecated. Use UIBarStyleBlack and set the translucent property to YES
UIImageView *bgImgView = [[UIImageView alloc] initWithFrame:self.view.bounds];
bgImgView.image = [UIImage imageNamed:@"huoying4.jpg"];
[self.view addSubview:bgImgView];
>
UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, bgImgView.frame.size.width*0.5, bgImgView.frame.size.height)];
toolbar.barStyle = UIBarStyleBlackTranslucent;
[bgImgView addSubview:toolbar];
- 在iOS8.0之后,蘋果新增了一個(gè)類UIVisualEffectView,通過這個(gè)類來實(shí)現(xiàn)毛玻璃效果與上面的UIToolbar一樣,而且效率也非常之高,使用也是非常簡單,幾行代碼搞定. UIVisualEffectView是一個(gè)抽象類,不能直接使用,需通過它下面的三個(gè)子類來實(shí)現(xiàn)(UIBlurEffect, UIVisualEffevt, UIVisualEffectView);
子類UIBlurEffect只有一個(gè)類方法,用來快速創(chuàng)建一個(gè)毛玻璃效果,參數(shù)是一個(gè)枚舉,用來設(shè)置毛玻璃的樣式,而UIVisualEffectView則多了兩個(gè)屬性和兩個(gè)構(gòu)造方法,用來快速將創(chuàng)建的毛玻璃添加到這個(gè)UIVisualEffectView上.
特別注意: 這個(gè)類是iOS8.0之后才適用, 所以如果項(xiàng)目要兼容iOS7.0的話, 還是要考慮其它的兩種方法了.
** 實(shí)現(xiàn)代碼:**
同樣是先快速的實(shí)例化UIBlurEffect并設(shè)置毛玻璃的樣式,然后再通過UIVisualEffectView的構(gòu)造方法將UIBlurEffect的實(shí)例添加上去, 最后設(shè)置frame或者是通過添加約束, 將effectView添加到要實(shí)現(xiàn)了毛玻璃的效果的view控件上,效果圖和上面的一樣.
iOS8.0
毛玻璃的樣式(枚舉)
UIBlurEffectStyleExtraLight,
UIBlurEffectStyleLight,
UIBlurEffectStyleDark
>
UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect];
effectView.frame = CGRectMake(0, 0, bgImgView.frame.size.width*0.5, bgImgView.frame.size.height);
[bgImgView addSubview:effectView];
項(xiàng)目地址:https://github.com/524429264/EffectViewDemo