CoreImage是蘋果自帶的關(guān)于圖像處理的框架,不僅可以做濾鏡,還可以做人臉識別猾编,我們今天先來簡單的了解一下濾鏡的功能旗芬,下次有機會再寫人臉識別的部分舌胶。
先看效果圖:
上邊是原圖疮丛,下邊是添加了結(jié)晶的模糊濾鏡效果圖幔嫂。
步驟:
- 創(chuàng)建CIImage實例,獲取圖片資源
- 根據(jù)濾鏡名稱創(chuàng)建濾鏡CIFilter
- 設(shè)置濾鏡參數(shù)(KVC方式設(shè)置)
- 創(chuàng)建繪制上下文誊薄,CIContext對象(兩種方式履恩,一種GPU渲染,另一種CPU渲染)
- 獲取渲染后的圖片資源CIImage
- 創(chuàng)建CGImageRef句柄
- 從句柄中取出圖片UIImage
- 釋放CGImageRef句柄
- 將渲染完成的UIImage放到頁面顯示
代碼
- (IBAction)change:(id)sender {
//獲取圖片資源,imageview.image是原圖
CIImage *image = [[CIImage alloc] initWithImage:self.preImageView.image];
//根據(jù)濾鏡名稱創(chuàng)建濾鏡
CIFilter *filter = [CIFilter filterWithName:@"CICrystallize" keysAndValues:kCIInputImageKey,image, nil];
// NSLog(@"%@",[CIFilter filterNamesInCategory:kCICategoryDistortionEffect]);
NSLog(@"%@",filter.attributes);
//這里使用的是默認參數(shù)呢蔫,也可自己設(shè)置
// [filter setDefaults];
[filter setValue:@(50.0) forKey:@"inputRadius"];
//創(chuàng)建繪制上下文切心,默認使用GPU繪制
CIContext *context = [CIContext contextWithOptions:nil];
//創(chuàng)建基于 GPU 的 CIContext 對象
// EAGLContext *gpucontext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
// CIContext *context = [CIContext contextWithEAGLContext: gpucontext];
//創(chuàng)建基于 CPU 的 CIContext 對象
// CIContext *context = [CIContext contextWithOptions: [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:kCIContextUseSoftwareRenderer]];
// 渲染并輸出CIImage
CIImage *outputImage = [filter outputImage];
// 創(chuàng)建CGImage句柄
CGImageRef Cgimage = [context createCGImage:outputImage fromRect:[outputImage extent]];
// 取出圖片
UIImage *showimage = [UIImage imageWithCGImage:Cgimage];
// 釋放CGImage句柄
CGImageRelease(Cgimage);
// 加濾鏡之后的圖片
self.finishImageView.image = showimage;
}
濾鏡名稱可以查看官方文檔
總共有14個大分類,每個大分類里又有很多具體的濾鏡咐刨。點開名稱可以看見具體的描述昙衅,屬性,以及屬性的類型和用法定鸟,還有效果圖而涉。
我們也可以通過
NSLog(@"%@",filter.attributes);
來獲得當前濾鏡的屬性的信息。濾鏡類型大概二百種左右吧联予,用法都差不多啼县,大家自己探索一下吧。