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

