iOS模糊 和 毛玻璃效果實(shí)現(xiàn)

模糊效果代碼下載地址

Untitled.gif

毛玻璃效果代碼下載地址

11.gif

模糊效果

1.** CoreImage: **iOS5.0之后就出現(xiàn)了Core Image的API,Core Image的API被放在CoreImage.framework庫(kù)中, 在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主要是用來(lái)做數(shù)字信號(hào)處理、圖像處理相關(guān)的向量、矩陣運(yùn)算的庫(kù)。圖像可以認(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];

區(qū)別:

效果:第一種Core Image設(shè)置模糊之后會(huì)在周?chē)a(chǎn)生白邊,vImage使用不存在任何問(wèn)題;
性能:圖像模糊處理屬于復(fù)雜的計(jì)算,大部分圖片模糊選擇的是vImage,性能最佳

毛玻璃效果

蘋(píng)果在iOS7.0之后,很多系統(tǒng)界面都使用了毛玻璃效果,增加了界面的美觀(guān)性,比如通知中心界面;其實(shí)在iOS7.0(包括)之前還是有系統(tǒng)的類(lèi)可以實(shí)現(xiàn)毛玻璃效果的, 就是 UIToolbar這個(gè)類(lèi)

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之后,蘋(píng)果新增了一個(gè)類(lèi)UIVisualEffectView,通過(guò)這個(gè)類(lèi)來(lái)實(shí)現(xiàn)毛玻璃效果與上面的UIToolbar一樣,而且效率也非常之高,使用也是非常簡(jiǎn)單,幾行代碼搞定. UIVisualEffectView是一個(gè)抽象類(lèi),不能直接使用,需通過(guò)它下面的三個(gè)子類(lèi)來(lái)實(shí)現(xiàn)(UIBlurEffect, UIVisualEffevt, UIVisualEffectView);
子類(lèi)UIBlurEffect只有一個(gè)類(lèi)方法,用來(lái)快速創(chuàng)建一個(gè)毛玻璃效果,參數(shù)是一個(gè)枚舉,用來(lái)設(shè)置毛玻璃的樣式,而UIVisualEffectView則多了兩個(gè)屬性和兩個(gè)構(gòu)造方法,用來(lái)快速將創(chuàng)建的毛玻璃添加到這個(gè)UIVisualEffectView上.
特別注意: 這個(gè)類(lèi)是iOS8.0之后才適用, 所以如果項(xiàng)目要兼容iOS7.0的話(huà), 還是要考慮其它的兩種方法了.

** 實(shí)現(xiàn)代碼:**
同樣是先快速的實(shí)例化UIBlurEffect并設(shè)置毛玻璃的樣式,然后再通過(guò)UIVisualEffectView的構(gòu)造方法將UIBlurEffect的實(shí)例添加上去, 最后設(shè)置frame或者是通過(guò)添加約束, 將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];

文/零距離仰望星空(簡(jiǎn)書(shū)作者)原文鏈接:http://www.lxweimin.com/p/6dd0eab888a6

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容