iOS圖片毛玻璃效果

效果圖

1.png

Demo下載地址:VisualDemo,覺得不錯還請給個star

前言

日常處理毛玻璃效果, 主要的用到就是這幾種方式
1.iOS5.0之后就出現(xiàn)了Core Image的API业岁。Core Image的API被放在CoreImage.framework庫中欺矫。在iOS和OS X平臺上磺陡,Core Image都提供了大量的濾鏡(Filter)猜旬,這也是Core Image庫中比較核心的東西之一肮街。按照官方文檔記載蛋逾,在OS X上有120多種Filter速勇,而在iOS上也有90多種截珍。
2.第三方框架GPUImage
3.iOS 7之前UIToolbar
4.iOS 8之后蘋果新增加的一個類UIVisualEffectView
5.vImage也是蘋果推出的一個庫在Accelerate.framework框架中

下面就依次講述這幾種方式的實現(xiàn)

Core Image實現(xiàn)方式代碼如下:

- (UIImage *)coreBlurImage:(UIImage *)image withBlurNumber:(CGFloat)blur{
    //獲取繪制上下文
    CIContext *context = [CIContext contextWithOptions:nil];
    //獲取CIImage
    CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage];
    //創(chuàng)建濾鏡對象 CIGaussianBlur:高斯模糊
    CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
    [filter setValue:inputImage forKey:kCIInputImageKey];
    //改變模糊效果值
    [filter setValue:@10.0f forKey:@"inputRadius"];
    //模糊圖片渲染并輸出CIImage
    CIImage *result = [filter valueForKey:kCIOutputImageKey];
    CGImageRef outImage = [context createCGImage:result fromRect:[result extent]];
    UIImage *blurImage = [UIImage imageWithCGImage:outImage];
    CGImageRelease(outImage);
    return blurImage;
}

CIGaussianBlur即是常用的高斯濾鏡, Filter都是按字符串的名字去創(chuàng)建的, 詳情見官方文檔除了這里提到的多種Filter之外锚扎,Core Image還提供了CIDetector等類吞瞪,可以支持人臉識別等,在OS X上Core Image也做了更多支持驾孔。

GPUImage

GPUImageGaussianBlurFilter * blurFilter = [[GPUImageGaussianBlurFilter alloc] init];
blurFilter.blurRadiusInPixels = 2.0;
UIImage * image = [UIImage imageNamed:@"xxx"];
UIImage *blurredImage = [blurFilter imageByFilteringImage:image];

代碼上比使用Core Image的情況簡單得多

上面2種都是比較耗性能的, 慎用

UIToolbar 簡單易懂芍秆,但是效果單一惯疙,系統(tǒng)提供的樣式也就UIBarStyleDefaultUIBarStyleBlack兩種

   UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
    imageView.image = [UIImage imageNamed:@"image"];
    imageView.contentMode = UIViewContentModeScaleAspectFill;
    imageView.layer.masksToBounds = YES;
    [self.view addSubview:imageView];
    
    /** UIBarStyle 毛玻璃的樣式(枚舉)
     *      UIBarStyleDefault          = 0,     // 淺色
     *      UIBarStyleBlack            = 1,     // 深色
     *      UIBarStyleBlackOpaque      = 1,     // Deprecated. Use UIBarStyleBlack
     *      UIBarStyleBlackTranslucent = 2,     // Deprecated. Use UIBarStyleBlack and set the translucent property to YES
     */
    UIToolbar * toolbar = [[UIToolbar alloc] initWithFrame:imageView.bounds];
    toolbar.barStyle = UIBarStyleBlack;
    toolbar.alpha = 0.9;
    [imageView addSubview:toolbar];

UIVisualEffectView : 比UIToolbar強大一點, 主要用到了這個類

  • UIVisualEffect : 繼承自UIView,可以看成是專門用于處理毛玻璃效果的視圖妖啥。使用UIVisuaEffectView有一點需要特別注意霉颠,不要在UIVisuaEffectView實例化View上面直接添加subViews,應該將需要添加的子視圖添加到其contentView上荆虱。同時蒿偎,盡量避免將UIVisualEffectView對象的alpha值設置為小于1.0的值,因為創(chuàng)建半透明的視圖會導致系統(tǒng)在離屏渲染時去對UIVisualEffectView對象及所有的相關的子視圖做混合操作,比較消耗性能怀读。
  • UIBlurEffect : 使用該效果诉位,會使得UIVisualEffectView下面的內(nèi)容出現(xiàn)毛玻璃化
  • UIVibrancyEffect : 生動效果, 該效果能夠放大和調(diào)整放在UIVisualEffectView對象下面的內(nèi)容的顏色
  • UIVisualEffect:一個視覺效果抽象類,繼承自NSObject菜枷,是UIBlurEffectUIVibrancyEffect的父類

UIBlurEffect

    _imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
    _imageView.image = [UIImage imageNamed:@"image"];
    _imageView.contentMode = UIViewContentModeScaleAspectFill;
    _imageView.layer.masksToBounds = YES;
    [self.view addSubview:_imageView];
    /**  UIBlurEffect 毛玻璃的樣式(枚舉)
     * UIBlurEffectStyleExtraLight, // 極度白
     * UIBlurEffectStyleLight,      // 淺色
     * UIBlurEffectStyleDark        // 深色
     */
    
    UIBlurEffect * effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
    UIVisualEffectView * effectView = [[UIVisualEffectView alloc] initWithEffect:effect];
    effectView.frame = CGRectMake(0, 100, self.view.bounds.size.width, 200);
    [_imageView addSubview:effectView];

UIVibrancyEffect

    UIBlurEffect * blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
    UIVibrancyEffect * vibrancy = [UIVibrancyEffect effectForBlurEffect:blurEffect];
    UIVisualEffectView * effectView = [[UIVisualEffectView alloc] initWithEffect:vibrancy];
    UIView *redView = [[UIView alloc]init];
    redView.backgroundColor = [UIColor blueColor];
    [effectView.contentView addSubview:redView];
    effectView.frame = CGRectMake(0, 310,375, 300);
    redView.frame = effectView.bounds;
    [self.view addSubview:effectView];

效果圖:

3.png

運用UIBlurEffect是可逆的苍糠,我們可以去掉蒙層,顯示圖片

 [effectView removeFromSuperview];

vImageAccelerate.framework框架中的這個framework主要是用來做數(shù)字信號處理啤誊、圖像處理相關的向量岳瞭、矩陣運算的庫。首先導入#import <Accelerate/Accelerate.h>我們可以認為我們的圖像都是由向量或者矩陣數(shù)據(jù)構成的坷衍,Accelerate里既然提供了高效的數(shù)學運算API寝优,自然就能方便我們對圖像做各種各樣的處理。模糊算法就是用到了vImageBoxConvolve_ARGB8888這個函數(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);
    
    //設置從CGImage獲取對象的屬性
    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;
}

總結(jié):

以上就是幾種常用的毛玻璃處理方式, 寫的不好還請小伙伴們見諒!

參考文獻:

iOS-毛玻璃效果詳解
iOS 開發(fā)之模糊效果的五種實現(xiàn)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枫耳,一起剝皮案震驚了整個濱河市乏矾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌迁杨,老刑警劉巖钻心,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異铅协,居然都是意外死亡捷沸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門狐史,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痒给,“玉大人,你說我怎么就攤上這事骏全〔园兀” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵姜贡,是天一觀的道長试吁。 經(jīng)常有香客問我,道長楼咳,這世上最難降的妖魔是什么熄捍? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任烛恤,我火速辦了婚禮,結(jié)果婚禮上余耽,老公的妹妹穿的比我還像新娘缚柏。我一直安慰自己,他們只是感情好宾添,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布船惨。 她就那樣靜靜地躺著柜裸,像睡著了一般缕陕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疙挺,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天扛邑,我揣著相機與錄音,去河邊找鬼铐然。 笑死蔬崩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的搀暑。 我是一名探鬼主播沥阳,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼自点!你這毒婦竟也來了桐罕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤桂敛,失蹤者是張志新(化名)和其女友劉穎功炮,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體术唬,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡薪伏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了粗仓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫁怀。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖借浊,靈堂內(nèi)的尸體忽然破棺而出塘淑,到底是詐尸還是另有隱情,我是刑警寧澤巴碗,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布朴爬,位于F島的核電站,受9級特大地震影響橡淆,放射性物質(zhì)發(fā)生泄漏召噩。R本人自食惡果不足惜母赵,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望具滴。 院中可真熱鬧凹嘲,春花似錦、人聲如沸构韵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疲恢。三九已至凶朗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間显拳,已是汗流浹背棚愤。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留杂数,地道東北人宛畦。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像揍移,于是被迫代替她去往敵國和親次和。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

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

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫那伐、插件踏施、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • iOS開發(fā)中有的時候需要將圖片設置模糊,來實現(xiàn)特定的效果獲取更好的用戶體驗, iOS7之后半透明模糊效果得到大范圍...
    零距離仰望星空閱讀 46,530評論 47 223
  • 昨天去體育館游泳喧锦,二百米過后读规,精疲力盡,在下一個五十米的盡頭燃少,右腳突然就被拉住束亏,一瞬間整個身體都沉下去了,當時就懵...
    只會蛙泳的企鵝閱讀 162評論 0 0
  • 認為的總是離開 或許再也遇不見你這樣的 蔚藍的天空 也只是你留下的云彩 會遇見的 是友情還是錯過的愛情 時光的這局...
    正捌閱讀 219評論 6 12
  • 有時候阵具,突然收到不常聯(lián)系的人發(fā)來的信息說系統(tǒng)檢測碍遍,感謝你沒有把我刪除了,突然覺得你這么提醒我我倒是想刪除了阳液。
    日音中又見察xx閱讀 588評論 0 0