iOS開發(fā)探索-高斯模糊&毛玻璃效果

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

毛玻璃效果
  1. 蘋果在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];
  1. 在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

掃描下方二維碼關(guān)注我

零距離仰望星空

在此感謝各位讀者的來訪,您的關(guān)注是我寫作分享的最大動(dòng)力。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仲翎,一起剝皮案震驚了整個(gè)濱河市痹扇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌溯香,老刑警劉巖鲫构,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逐哈,居然都是意外死亡芬迄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門昂秃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來禀梳,“玉大人,你說我怎么就攤上這事肠骆∷阃荆” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蚀腿,是天一觀的道長嘴瓤。 經(jīng)常有香客問我,道長莉钙,這世上最難降的妖魔是什么廓脆? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮磁玉,結(jié)果婚禮上停忿,老公的妹妹穿的比我還像新娘。我一直安慰自己蚊伞,他們只是感情好席赂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布吮铭。 她就那樣靜靜地躺著,像睡著了一般颅停。 火紅的嫁衣襯著肌膚如雪谓晌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天癞揉,我揣著相機(jī)與錄音纸肉,去河邊找鬼。 笑死烧董,一個(gè)胖子當(dāng)著我的面吹牛毁靶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逊移,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼预吆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了胳泉?” 一聲冷哼從身側(cè)響起拐叉,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扇商,沒想到半個(gè)月后凤瘦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡案铺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年蔬芥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片控汉。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡笔诵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姑子,到底是詐尸還是另有隱情乎婿,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布街佑,位于F島的核電站谢翎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏沐旨。R本人自食惡果不足惜森逮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望磁携。 院中可真熱鬧吊宋,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳞上。三九已至这吻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間篙议,已是汗流浹背唾糯。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鬼贱,地道東北人移怯。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像这难,于是被迫代替她去往敵國和親舟误。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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