最近對圖像處理方面的東西比較感興趣,剛好看了CoreImage這個強大的圖像處理框架潦匈,下面就跟大家分享一下粘勒。
首先,先了解一下CoreImage這個框架以及其中常用的幾個類:
CoreImage是IOS5中新加入的一個Objective-c的框架钩蚊,里面提供了強大高效的圖像處理功能,用來對基于像素的圖像進行操作與分析蹈矮。IOS提供了很多強大的濾鏡(Filter)砰逻,這些Filter提供了各種各樣的效果,并且還可以通過濾鏡鏈將各種效果的Filter疊加起來泛鸟,形成強大的自定義效果蝠咆,如果你對該效果不滿意,還可以子類化濾鏡北滥。
· CIImage
是保存圖像數(shù)據(jù)的類刚操,它有四種比較常用的初始化方式:
1.imageWithCGImage:
2.imageWithContentsOfURL:
3.imageWithCVImageBuffer:
4.imageWithData:
也可以通過圖像數(shù)據(jù)類比如UIImage,CGImageRef等等初始化再芋。
· CIFilter
濾鏡類菊霜,這個框架中對圖片屬性進行細節(jié)處理的類。濾鏡使用鍵-值來設(shè)置輸入值济赎,一旦這些值設(shè)置好鉴逞,CIFilter就可以用來生成新的CIImage輸出圖像了记某。它的初始化一般用:
CIFilter * filter = [CIFilter filterWithName:@"CIGaussianBlur"];
下面是查詢需要的濾鏡種類的方法:
1.查詢 效果分類中 包含什么效果:filterNamesInCategory:
(1)按住command 點擊CIFilter 進入接口文件 找到第128行-148行全部都是 效果分類
(2)選擇其中某一個分類 NSLog -> [CIFilter filterNamesInCategory:剛才拷貝的分類]; -> 打印出來的 是這個分類包含的所有 效果 -> 拷貝選擇其中的某一個效果.
2.查詢 使用的效果中 可以設(shè)置什么屬性(KVC) attributes
NSLog -> [CIFilter filterWithName:剛才拷貝選擇其中的某一個效果].attributes ->得到這個濾鏡所有可以設(shè)置的屬性
調(diào)用[CIFilter attributes]會返回filter詳細信息,
·CIContext
CIContext又稱上下文用來渲染CIImage构捡,將作用在CIImage上的濾鏡鏈應(yīng)用到原始的圖片數(shù)據(jù)中液南。
利用下面的語句得到處理后的圖片
CIImage * resultImage = [sepiaTone valueForKey:@"outputImage"];
CGImageRef imageRef = [context createCGImage:resultImage fromRect:CGRectMake(0,0,self.image.size.width,self.image.size.height)];
UIImage * image = [UIImage imageWithCGImage:imageRef];
現(xiàn)在我們大概了解過了CoreImage以及它的幾個常用類的概念。
現(xiàn)在實戰(zhàn)開始:
具體步驟:
1勾徽、導(dǎo)入CoreImage框架
2滑凉、創(chuàng)建CIImage對象
3、創(chuàng)建CIFilter
4捂蕴、利用鍵值對設(shè)置CIFilter的各種屬性
5譬涡、獲得處理后的圖片
6、將得到的圖片渲染到視圖上
#import "ViewController.h"
#import <CoreImage/CoreImage.h>
//枚舉選擇是改變圖片的色調(diào)還是模糊度
typedef NS_ENUM(int,Stype) {
///舊色調(diào)
SepiaTone =0,
///模糊設(shè)置
GaussianBlur,
};
@interface ViewController ()
@property(nonatomic,retain)UISlider * slider;
@property(nonatomic,retain)UISegmentedControl * segmentControl;
@property(nonatomic,assign)Stype type;
@property(nonatomic,retain)UIImageView * imgView;
@property(nonatomic,retain)UIImage * image;
@property(nonatomic,retain)UIImageView * imageView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.edgesForExtendedLayout = UIRectEdgeNone;
_image = [UIImage imageNamed:@"1.jpg"];
_imageView = [[UIImageView alloc]initWithFrame:self.view.frame];
_imageView.userInteractionEnabled = YES;
[_imageView setImage:_image];
[self.view addSubview:_imageView];
UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(50,10,280,30)];
label.text =@"先選中按鈕啥辨,再拖動滑塊即可達到想要的效果";
label.font = [UIFont systemFontOfSize:14.0];
[_imageView addSubview:label];
_slider = [[UISlider alloc]initWithFrame:CGRectMake(50,50,200,40)];
_slider.maximumValue =1.0;
_slider.minimumValue =0;
_slider.continuous =YES;
[_slider addTarget:self action:@selector(valueChange)forControlEvents:UIControlEventValueChanged];
[_imageView addSubview:_slider];
_segmentControl = [[UISegmentedControl alloc]initWithFrame:CGRectMake(100,80,120,40)];
[_segmentControl insertSegmentWithTitle:@"舊色調(diào)"atIndex:0 animated:YES];
[_segmentControl insertSegmentWithTitle:@"模糊設(shè)置"atIndex:1 animated:YES];
[_segmentControl addTarget:self action:@selector(ButtonAction)forControlEvents:UIControlEventValueChanged];
self.navigationItem.titleView = _segmentControl;
}
-(void)ButtonAction
{
switch (_segmentControl.selectedSegmentIndex) {
case 0:
{
self.type =SepiaTone;//舊色調(diào)
}
break;
default:
{
self.type =GaussianBlur;//模糊設(shè)置
}
break;
}
}
-(void)valueChange
{
switch (self.type) {
case SepiaTone:
{
//舊色調(diào)
[self filterSepiaTone];
}
break;
default:
{
//模糊設(shè)置
[self filterGaussianBlur];
}
break;
}
}
//舊色調(diào)處理
-(void)filterSepiaTone
{
//創(chuàng)建CIContext對象(默認值,傳入nil)
CIContext * context = [CIContext contextWithOptions:nil];
//獲取圖片
CIImage *cimage = [CIImage imageWithCGImage:[_image CGImage]];
//創(chuàng)建CIFilter
CIFilter * sepiaTone = [CIFilter filterWithName:@"CISepiaTone"];
//設(shè)置濾鏡輸入?yún)?shù)
[sepiaTone setValue:cimage forKey:@"inputImage"];
//獲取滑塊的Value盯腌,設(shè)置色調(diào)強度
[sepiaTone setValue:[NSNumber numberWithFloat:[_slider value]]forKey:@"inputIntensity"];
//創(chuàng)建處理后的圖片
CIImage * resultImage = [sepiaTone valueForKey:@"outputImage"];
CGImageRef imageRef = [context createCGImage:resultImage fromRect:CGRectMake(0,0,self.image.size.width,self.image.size.height)];
UIImage * image = [UIImage imageWithCGImage:imageRef];
[_imageView setImage:image];
CFRelease(imageRef);
}
//模糊設(shè)置處理
-(void)filterGaussianBlur
{
//創(chuàng)建CIContext對象
CIContext * context = [CIContext contextWithOptions:nil];
//獲取圖片
CIImage * image = [CIImage imageWithCGImage:[_image CGImage]];
//創(chuàng)建CIFilter
CIFilter * gaussianBlur = [CIFilter filterWithName:@"CIGaussianBlur"];
//設(shè)置濾鏡輸入?yún)?shù)
[gaussianBlur setValue:image forKey:@"inputImage"];
//設(shè)置模糊參數(shù)
[gaussianBlur setValue:[NSNumber numberWithFloat:_slider.value*10] forKey:@"inputRadius"];
//得到處理后的圖片
CIImage* resultImage = [gaussianBlur valueForKey:@"outputImage"];
CGImageRef imageRef = [context createCGImage:resultImage fromRect:CGRectMake(0,0,self.image.size.width,self.image.size.height)];
UIImage * image = [UIImage imageWithCGImage:imageRef];
[_imageView setImage:imge];
CFRelease(imageRef);
}
@end
設(shè)置模糊度和色調(diào)的方法里面有重復(fù)代碼溉知,有興趣的話可以自己封裝一下,精簡代碼量腕够。