一扫皱、濾鏡的內(nèi)容和效果是比較多并且復(fù)雜的 ,學(xué)習(xí)濾鏡需要技巧 如下:
兩個(gè)輸出語(yǔ)句解決濾鏡的屬性選擇問題:
- 1.查詢效果分類中包含什么效果
按住command 點(diǎn)擊CIFilter 進(jìn)入接口文件 找到第128行-148行全部都是 效果分類 - 2.選擇其中某一個(gè)分類拷貝
NSLog -> [CIFilter filterNamesInCategory:剛才拷貝的分類]; -> 打印出來的 是這個(gè)分類包含的所有效果 -> 拷貝選擇其中的某一個(gè)效果 - 3.查詢使用的效果中可以設(shè)置什么屬性(KVC) attributes
NSLog -> [CIFilter filterWithName:剛才拷貝選擇其中的某一個(gè)效果].attributes ->得到這個(gè)濾鏡所有可以設(shè)置的屬性
二析既、了解濾鏡的相關(guān)介紹
介紹
- 1.框架介紹
(1)CoreImage
(2)是一個(gè)圖像框架 它基于OpenGL頂層創(chuàng)建 底層則用著色器來處理圖像
(3)它利用了GPU基于硬件加速來處理圖像
(4)CoreImage中有很多濾鏡
(5)它們能夠一次給予一張圖像或者視頻幀多種視覺效果 -> 濾鏡鏈
(6)而且濾鏡可以連接起來組成一個(gè)濾鏡鏈 把濾鏡效果疊加起來處理圖像 - 2.類的介紹
(1)CIImage:保存圖像數(shù)據(jù)的類 CGImageRef->圖像中的數(shù)據(jù)
(2).CIFilter:濾鏡類 圖片屬性進(jìn)行細(xì)節(jié)處理的類 它對(duì)所有的像素進(jìn)行操作 用鍵-值(KVC)來設(shè)置
(3).CIContext:上下文是實(shí)現(xiàn)對(duì)圖像處理的具體對(duì)象 -> 濾鏡對(duì)象輸出的圖像并不是合成之后的圖像 需要使用圖像處理的上下文合并處理的圖像 - 3.效果介紹
- 按效果分類:
kCICategoryDistortionEffect 扭曲效果,比如bump谆奥、旋轉(zhuǎn)眼坏、hole
kCICategoryGeometryAdjustment 幾何開著調(diào)整,比如仿射變換酸些、平切宰译、透視轉(zhuǎn)換
kCICategoryCompositeOperation 合并,比如源覆蓋(source over)擂仍、最小化囤屹、源在頂(source atop)、色彩混合模式
kCICategoryHalftoneEffect Halftone效果逢渔,比如screen、line screen乡括、hatched
kCICategoryColorAdjustment 色彩調(diào)整肃廓,比如伽馬調(diào)整、白點(diǎn)調(diào)整诲泌、曝光
kCICategoryColorEffect 色彩效果盲赊,比如色調(diào)調(diào)整、posterize
kCICategoryTransition 圖像間轉(zhuǎn)換敷扫,比如dissolve哀蘑、disintegrate with mask、swipe
kCICategoryTileEffect 瓦片效果葵第,比如parallelogram绘迁、triangle
kCICategoryGenerator 圖像生成器,比如stripes卒密、constant color缀台、checkerboard
kCICategoryGradient 漸變,比如軸向漸變哮奇、仿射漸變膛腐、高斯?jié)u變
kCICategoryStylize 風(fēng)格化,比如像素化鼎俘、水晶化
kCICategorySharpen 銳化哲身、發(fā)光 - kCICategoryBlur 模糊,比如高斯模糊贸伐、焦點(diǎn)模糊勘天、運(yùn)動(dòng)模糊
- 按使用場(chǎng)景分類:
kCICategoryStillImage 用于靜態(tài)圖像
kCICategoryVideo 用于視頻
kCICategoryInterlaced 用于交錯(cuò)圖像
kCICategoryNonSquarePixels 用于非矩形像素
kCICategoryHighDynamicRange 用于HDR
三、使用步驟
1.實(shí)例CIImage -> 先把UIImage -> CGImageRef -> CIImage
2.創(chuàng)建CIFilter濾鏡并給濾鏡設(shè)置屬性(KVC)
3.創(chuàng)建CIContext上下文
4.初始化一個(gè)CGImageRef 輸出圖片對(duì)象 合并濾鏡輸出的圖像
5.賦給UIImage對(duì)象進(jìn)行顯示
6.如果想使用濾鏡鏈 可以再次添加效果
四、一個(gè)實(shí)例解析 濾鏡 濾鏡鏈 保存圖片
代碼示例:
#import "ViewController.h"http://宏定義 屏幕的寬
#define SCREEN_WIDTH CGRectGetWidth([UIScreen mainScreen].bounds)
//注意掛上代理
@interface ViewController () <UIImagePickerControllerDelegate,UINavigationControllerDelegate>
{
UIImageView *myImageView;//接收?qǐng)D片的視圖
UIButton *photoButton;//從本地相冊(cè)選擇圖片的按鈕
UIButton *filterButton;//添加濾鏡的按鈕
UIButton *saveButton;//濾鏡后保存到本地相冊(cè)的按鈕
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//去除導(dǎo)航欄的高度
self.edgesForExtendedLayout = UIRectEdgeNone;
//設(shè)置背景色
self.view.backgroundColor = [UIColor greenColor];
// 創(chuàng)建按鈕
NSArray *titleButtonList = @[@"photo",@"Filter",@"save"];
for (int i=0; i<titleButtonList.count; i++) {
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(20+80*i, 20, 60, 40);
[button setTitle:titleButtonList[i] forState:UIControlStateNormal];
button.tag = 10 +i ;
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
button.backgroundColor = [UIColor cyanColor];
[self.view addSubview:button];
}
// 初始化圖片視圖
myImageView = [[UIImageView alloc]initWithFrame:CGRectMake(20, 100, SCREEN_WIDTH-40, 300)];
myImageView.backgroundColor = [UIColor cyanColor];
[self.view addSubview:myImageView];
photoButton = [self.view viewWithTag:10];
filterButton = [self.view viewWithTag:11];
saveButton = [self.view viewWithTag:12];
// 給三個(gè)按鈕添加觸發(fā)事件
[photoButton addTarget:self action:@selector(photoAction:) forControlEvents:UIControlEventTouchUpInside];
// 濾鏡按鈕
[filterButton addTarget:self action:@selector(filterAction:) forControlEvents:UIControlEventTouchUpInside];
//保存濾鏡后圖片的按鈕
[saveButton addTarget:self action:@selector(saveAction:) forControlEvents:UIControlEventTouchUpInside];
}
//選擇圖片
- (void)photoAction:(UIButton *)sender{
UIImagePickerController *pickerController = [[UIImagePickerController alloc]init];
pickerController.delegate = self;
[self presentViewController:pickerController animated:YES completion:nil];
}
//把圖片放在圖片視圖上
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
UIImage *image = info[UIImagePickerControllerOriginalImage];
myImageView.image = image;
[self dismissViewControllerAnimated:YES completion:nil];
}
//濾鏡按鈕的觸發(fā)方法
- (void)filterAction:(UIButton *)sender{
// 1.源圖
CIImage *inputImage = [CIImage imageWithCGImage:myImageView.image.CGImage];
// 2.濾鏡
CIFilter *filter = [CIFilter filterWithName:@"CIColorMonochrome"];
// NSLog(@"%@",[CIFilter filterNamesInCategory:kCICategoryColorEffect]);//注意此處兩個(gè)輸出語(yǔ)句的重要作用
NSLog(@"%@",filter.attributes);
[filter setValue:inputImage forKey:kCIInputImageKey];
[filter setValue:[CIColor colorWithRed:1.000 green:0.165 blue:0.176 alpha:1.000] forKey:kCIInputColorKey];
CIImage *outImage = filter.outputImage;
[self addFilterLinkerWithImage:outImage];
}
//再次添加濾鏡 形成濾鏡鏈
- (void)addFilterLinkerWithImage:(CIImage *)image{
CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"];
[filter setValue:image forKey:kCIInputImageKey];
[filter setValue:@(0.5) forKey:kCIInputIntensityKey];
// 在這里創(chuàng)建上下文 把濾鏡和圖片進(jìn)行合并
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef resultImage = [context createCGImage:filter.outputImage fromRect:filter.outputImage.extent];
myImageView.image = [UIImage imageWithCGImage:resultImage];
}
//保存濾鏡后的圖片到本地相冊(cè)
- (void)saveAction:(UIButton *)sender{
UIImageWriteToSavedPhotosAlbum(myImageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}
//保存成功調(diào)用的方法
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
NSLog(@"保存成功");
}
@end