其中選圖按鈕的觸發事件方法名為:SelectImage保存按鈕的觸發事件方法名為:SaveCore Image利用Quartz 2D我們可以繪制各類圖形、圖像,功能確實強大。用過photoshop的朋友都知道,使用photoshop可以制作各種濾鏡特效,那么在iOS中能否實現濾鏡呢?在iOS5.0之前這些算法基本全部要靠程序員編程實現,實現過程相當復雜。從iOS5.0開始蘋果官方已經提供了Core Image框架來幫助開發者進行特效制作。先來看一下濾鏡使用過程中常用的基類對象:
CIContext:圖像上下文,用于管理整個圖片處理過程,不同的圖形上下文將利用不同的圖像處理硬件進行圖像處理(在iOS中可以通過不同的方式創建圖像上下文,例如可以創建基于CPU的圖像上下方、創建基于GPU的圖像上下方以及創建OpenGL優化過的圖像上下文)。
CIFilter:圖像處理濾鏡,每種濾鏡有不同的參數設置。
CIImage:Core Image框架中的圖像類型,主要用于輸入和輸出圖像。在使用濾鏡之前我們先要弄清平臺主要支持哪些濾鏡,以及這些濾鏡的方法和參數如何設置,此時不妨使用下面的方法進行打印查看:
#pragma mark 查看所有內置濾鏡
-(void)showAllFilters{??
NSArray *filterNames=[CIFilter filterNamesInCategory:kCICategoryBuiltIn];?
? for (NSString *filterName in filterNames) {? ? ?
? CIFilter *filter=[CIFilter filterWithName:filterName];? ? ??
NSLog(@"\rfilter:%@\rattributes:%@",filterName,[filter attributes]);?
? }}
在iOS7中打印會發現有127中濾鏡,如果我們把每種濾鏡都介紹一遍恐怕用幾章內容也很難介紹詳細,事實上也沒有這個必要。這些濾鏡使用方法是類似的,只是參數設置有所區別。在iOS文檔中可以搜索“core image filter reference”一節的內容,里面有每種濾鏡的詳細介紹和圖片使用效果。使用Core Image框架創建濾鏡效果一般分為以下幾步:1.創建圖像上下文CIContext2.創建濾鏡CIFilter3.創建過濾原圖片CIImage4.調用CIFilter的setValue: forKey:方法為濾鏡指定源圖片5.設置濾鏡參數【可選】6.取得輸出圖片顯示或保存大家都知道在美圖秀秀中有一個“增強”功能,利用它可以調整照片的飽和度、亮度、對比度,其實在Core Image中也有這樣一款濾鏡,下面就以顏色濾鏡來演示一下Core Image中濾鏡的使用。話不多少上代碼~~~
#import "ViewController.h"? ? @interface ViewController (){
UIImagePickerController *_imagePickerController;//系統照片選擇控制器
CIContext *_context;//Core Image上下文
CIImage *_image;//我們要編輯的圖像
CIImage *_outputImage;//處理后的圖像
CIFilter *_colorControlsFilter;//色彩濾鏡
}
@property (weak, nonatomic) IBOutlet UIImageView *imgView;
@property (weak, nonatomic) IBOutlet UISlider *Staturation;
@property (weak, nonatomic) IBOutlet UISlider *Brightness;
@property (weak, nonatomic) IBOutlet UISlider *Contrast;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//初始化圖片選擇器
_imagePickerController=[[UIImagePickerController alloc]init];
_imagePickerController.delegate =self;
self.imgView.contentMode = UIViewContentModeScaleAspectFit;
self.imgView.userInteractionEnabled = YES;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(SelectImage:)];
[self.imgView addGestureRecognizer:tap];
//飽和度滑竿
_Staturation.minimumValue=0;
_Staturation.maximumValue=2;
_Staturation.value=1;
[_Staturation addTarget:self action:@selector(changeStaturation:) forControlEvents:UIControlEventValueChanged];
//亮度滑竿
_Brightness.minimumValue=-1;
_Brightness.maximumValue=1;
_Brightness.value=0;
[_Brightness addTarget:self action:@selector(changeBrightness:) forControlEvents:UIControlEventValueChanged];
//對比度滑竿
_Contrast.minimumValue=0;
_Contrast.maximumValue=2;
_Contrast.value=1;
[_Contrast addTarget:self action:@selector(changeContrast:) forControlEvents:UIControlEventValueChanged];
//初始化CIContext
//創建基于CPU的圖像上下文
//? ? NSNumber *number=[NSNumber numberWithBool:YES];
//? ? NSDictionary *option=[NSDictionary dictionaryWithObject:number forKey:kCIContextUseSoftwareRenderer];
//? ? _context=[CIContext contextWithOptions:option];
//使用GPU渲染,推薦,但注意GPU的CIContext無法跨應用訪問,例如直接在UIImagePickerController的完成方法中調用上下文處理就會自動降級為CPU渲染,所以推薦現在完成方法中保存圖像,然后在主程序中調用
_context=[CIContext contextWithOptions:nil];
//? ? EAGLContext *eaglContext=[[EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES1];
//? ? _context=[CIContext contextWithEAGLContext:eaglContext];//OpenGL優化過的圖像上下文
//取得濾鏡
_colorControlsFilter=[CIFilter filterWithName:@"CIColorControls"];
}
- (IBAction)SelectImage:(UIButton *)sender {
//把Slider的值重置成默認值
self.Staturation.value = 1;
self.Brightness.value = 0;
self.Contrast.value = 1;
//打開圖片選擇器
[self presentViewController:_imagePickerController animated:YES completion:nil];
}
- (IBAction)Save:(UIButton *)sender {
//保存照片到相冊
UIImageWriteToSavedPhotosAlbum(self.imgView.image, nil, nil, nil);
UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"提示" message:@"保存成功!" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"好的", nil nil];
[alert show];
}
#pragma mark 圖片選擇器選擇圖片代理方法
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
//關閉圖片選擇器
[self dismissViewControllerAnimated:YES completion:nil];
//取得選擇圖片
UIImage *selectedImage=[info objectForKey:UIImagePickerControllerOriginalImage];
self.imgView.image=selectedImage;
//初始化CIImage源圖像
_image=[CIImage imageWithCGImage:selectedImage.CGImage];
[_colorControlsFilter setValue:_image forKey:@"inputImage"];//設置濾鏡的輸入圖片
}
#pragma mark 將輸出圖片設置到UIImageView
-(void)setImage{
CIImage *outputImage= [_colorControlsFilter outputImage];//取得輸出圖像
CGImageRef temp=[_context createCGImage:outputImage fromRect:[outputImage extent]];
self.imgView.image=[UIImage imageWithCGImage:temp];//轉化為CGImage顯示在界面中
CGImageRelease(temp);//釋放CGImage對象
}
#pragma mark 調整飽和度
-(void)changeStaturation:(UISlider *)slider{
[_colorControlsFilter setValue:[NSNumber numberWithFloat:slider.value] forKey:@"inputSaturation"];//設置濾鏡參數
[self setImage];
}
#pragma mark 調整亮度
-(void)changeBrightness:(UISlider *)slider{
[_colorControlsFilter setValue:[NSNumber numberWithFloat:slider.value] forKey:@"inputBrightness"];
[self setImage];
}
#pragma mark 調整對比度
-(void)changeContrast:(UISlider *)slider{
[_colorControlsFilter setValue:[NSNumber numberWithFloat:slider.value] forKey:@"inputContrast"];
[self setImage];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
再給大家強調一下
在上面的代碼中除了使用了基于GPU的圖像上下文(推薦方式),也創建了其他圖像上下文,盡管已經被注釋大家還是需要熟悉。
Core Image允許你一次給圖像或視頻幀疊加多種效果,同時Core Image還能保證強大的處理效率。
和在使用Core Graphics繪圖一樣,UIKit中也封裝了一些方法直接轉換為Core Image中的對象,例如UIImage對象可以直接調用CIImage屬性轉換為CIImage類型。