iOS 模糊效果的使用

1. CoreImage 中的模糊濾鏡

  • a. coreImage是蘋果用來簡化圖片處理的框架
  • b. CIImage, CIFilter與CIContext三者之間的聯(lián)系(CoreImage中三個(gè)重要的類)
  • c. CIGaussianBlur(高斯模糊)中可以設(shè)置的參數(shù)
    高斯模糊效果:


    Simulator Screen Shot 2016年4月7日 下午12.51.48.png

    Simulator Screen Shot 2016年4月7日 下午12.52.23.png
// 原始圖片
    UIImage *image           = [UIImage imageNamed:@"12.jpg"];
    
    /*-----------------CoreImage部分--------------------*/
    
    // CIImage
    CIImage *ciImage         = [[CIImage alloc] initWithImage:image];
    
    // CIFilter(濾鏡的名字, 不要寫錯(cuò) 高斯模糊)
    CIFilter *blurFilter     = [CIFilter filterWithName:@"CIGaussianBlur"];
    
    // 將圖片輸入到濾鏡中
    [blurFilter setValue:ciImage forKey:kCIInputImageKey];
    
    /**在傳入圖片進(jìn)入濾鏡后,可以更改濾鏡的一些參數(shù)進(jìn)行設(shè)置,比如模糊程度等*/
    NSLog(@"%@", [blurFilter attributes]); // 打印看一下有哪些參數(shù)可以設(shè)置及相關(guān)信息
    // inputRadius參數(shù): 模糊的程度 默認(rèn)為10, 范圍為0-100, 接收的參數(shù)為NSNumber類型
    
    // 設(shè)置模糊的程度
    [blurFilter setValue:@(8) forKey:@"inputRadius"];
    
    // 將處理好的圖片輸出
    CIImage *outImage        = [blurFilter valueForKey:kCIOutputImageKey];
    
    // CIContext 上下文(參數(shù)nil->默認(rèn)為CPU渲染, 如果想用GPU渲染來提高效率的話,則需要傳參數(shù))
    CIContext *context       = [CIContext contextWithOptions:nil];
    
    // 將處理好的圖片創(chuàng)建出來 outImage原來的大小size
    CGImageRef outputCGImage = [context createCGImage:outImage
                                             fromRect:[outImage extent]];
    
    UIImage *blurImage       = [UIImage imageWithCGImage:outputCGImage];
    
    // 釋放CGImageRef
    CGImageRelease(outputCGImage);
    /*-------------------------------------------------*/


    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 568)];
    imageView.center       = self.view.center;
    imageView.image        = blurImage;
    [self.view addSubview:imageView];

從上面可以看出 Core Image為了做得比較靈活,F(xiàn)ilter都是按字符串的名字去創(chuàng)建的,比如高斯模糊濾鏡就是“CIGaussianBlur”,這里有一個(gè)官方列表可以參看。
除了這里提到的多種Filter之外,Core Image還提供了CIDetector等類,可以支持人臉識(shí)別等,在OS X上Core Image也做了更多支持。

2. 基于vImage的UIImage+ImageEffects的category 模糊效果

  • a.UIImage+ImageEffects是Accelerate框架中的內(nèi)容
  • b.UIImage+ImageEffects的模糊效果非常美觀
  • c.修改過的UIImage+ImageEffects可以對(duì)圖片進(jìn)行局模糊等非常多的效果

Accelerate這個(gè)framework主要是用來做數(shù)字信號(hào)處理、圖像處理相關(guān)的向量、矩陣運(yùn)算的庫。我們可以認(rèn)為我們的圖像都是由向量或者矩陣數(shù)據(jù)構(gòu)成的,Accelerate里既然提供了高效的數(shù)學(xué)運(yùn)算API,自然就能方便我們對(duì)圖像做各種各樣的處理。
基于vImage我們可以根據(jù)圖像的處理原理直接做模糊效果,或者使用現(xiàn)有的工具。UIImage+ImageEffects是個(gè)很好的圖像處理庫
這里提供一個(gè)下載地址(一個(gè)老師進(jìn)行的改進(jìn),里面有部分用法說明)

3. GPUImage

第三方圖片處理的開源庫的下載地址
同樣是做高斯模糊,用GPUImage可以這樣:

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

4. iOS8 中 UIVisualEffectView 模糊效果

  • UIVisualEffectView的模糊效果是即時(shí)渲染的
  • 在UIVisualEffectView上面添加文本顯示要做一些特殊的處理
  • 只有在iOS8以上才可以使用
    代碼如下:
// 原始圖片
    UIImage *image = [UIImage imageNamed:@"12.jpg"];
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 568)];
    imageView.userInteractionEnabled = YES;
    imageView.center       = self.view.center;
    imageView.image        = image;
    [self.view addSubview:imageView];
    
    // 為了更好的看到UIVisualEffectView的即時(shí)渲染效果添加平移手勢
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGesture:)];
    [imageView addGestureRecognizer:pan];
    
    // 創(chuàng)建模糊View
    UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
    
    effectView.frame = CGRectMake(0, 0, 320, 200);
    effectView.center = self.view.center;
    [self.view addSubview:effectView];
    
    
    UILabel *label = [[UILabel alloc] initWithFrame:effectView.bounds];
    label.text = @"東方未明";
    label.textAlignment = NSTextAlignmentCenter;
    label.font = [UIFont systemFontOfSize:30];
//    [effectView.contentView addSubview:label];
    // 在創(chuàng)建的模糊View的上面再添加一個(gè)子模糊View
    UIVisualEffectView *subEffectView = [[UIVisualEffectView alloc] initWithEffect:[UIVibrancyEffect effectForBlurEffect:(UIBlurEffect *)effectView.effect]];
    
    subEffectView.frame = effectView.bounds;
    
    [effectView.contentView addSubview:subEffectView];
    
    [subEffectView.contentView addSubview:label];
}

- (void)panGesture:(UIPanGestureRecognizer *)gesture
{
    CGPoint point = [gesture translationInView:gesture.view];
    gesture.view.center = CGPointMake(gesture.view.center.x + point.x,
                                      gesture.view.center.y + point.y);
    [gesture setTranslation:CGPointZero inView:gesture.view];
}

效果:


1.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • iOS開發(fā)中有的時(shí)候需要將圖片設(shè)置模糊,來實(shí)現(xiàn)特定的效果獲取更好的用戶體驗(yàn), iOS7之后半透明模糊效果得到大范圍...
    零距離仰望星空閱讀 46,865評(píng)論 47 223
  • iOS7后,半透明模糊效果得到了廣泛的使用,所以iOS開發(fā)過程中經(jīng)常需要用到半透明模糊效果,本文對(duì)比列舉幾種實(shí)現(xiàn)半...
    乒什么乓閱讀 28,450評(píng)論 18 85
  • 本篇文章主要是對(duì)在iOS上做半透明模糊效果的開發(fā)實(shí)現(xiàn)做整理。 雖然iOS很早就支持使用模糊效果對(duì)圖片等進(jìn)行處理,但...
    ch32053閱讀 6,509評(píng)論 3 53
  • 劇情介紹 在iOS開發(fā)中,經(jīng)常會(huì)看到毛玻璃效果,也叫模糊效果,比如系統(tǒng)的通知中心,這個(gè)很時(shí)髦的效果增加了美觀性。 ...
    NotFunGuy閱讀 8,511評(píng)論 9 38
  • 微風(fēng)拂過,在辦公室多呆了四個(gè)小時(shí),有點(diǎn)悶熱,身上粘粘的,風(fēng)一吹,格外清醒… 我等到了我想要的答案,心里的惶恐和不安...
    宋三思閱讀 427評(píng)論 0 0

友情鏈接更多精彩內(nèi)容