iOS濾鏡效果的實現:CoreImage

其中選圖按鈕的觸發事件方法名為: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類型。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容