实现滤镜功能所用了一些简单的xcode自带的框架 ,如<AssetsLibrary/AssetsLibrary.h>,<CoreImage/CoreImage.h> 等框架.功能实现来说相对比较简单。具体有功能有如下几点.1.对图片进行老旧化、复古化处理 2.对图片进行旋转处理 3.重置图片 4.访问相册,并选取相册中的图片来进行滤镜处理 5.保存处理后的图片到相册中
框架实现的原理有利用CoreImage 框架创建基于GPU的CIContext对象,创建CIImage用于处理需要处理的图片,创建CIFilter,具体实施渲染,进行处理后进行图片输出,重置图片就是当改变slider的value时,其他参数回归到初始值。访问相册要用到UIImagePickerController及其代理方法,保存图片就要用到AssetsLibrary框架进行写入处理.
那么,接下来我们用具体代码来实现下功能。首先我们需要创建好一个带xib的viewController,并且在里面拖入三个slider(用作测试三种效果),然后设置它们的移动事件,导入上述的两个框架。首先我们需要做的是打印所有过滤器的信息,方便我们进行查找具体滤镜的效果和它的参数范围,代码如下:
//所有滤镜的效果
NSArray *properties = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];
//遍历所有效果的参数,并且打印出来,用于参考
for (NSString *filterName in properties) {
CIFilter *fltr = [CIFilter filterWithName:filterName];
NSLog(@"%@:\n%@" , filterName,[fltr attributes]);
}
首先我们需要实现的是老旧色彩的改变 :
1.首先我们得到图片的路径,加载出来,转换成CIImage类型
ViewController.h 文件
(strong, nonatomic) CIImage *beginImage;
(strong, nonatomic) CIContext *context;
@property (strong, nonatomic) CIFilter *filter;
ViewController.m文件
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"屏幕快照 2015-03-30 下午6.47.56.png" ofType:nil];
NSURL *fileNameAndPath = [NSURL fileURLWithPath:filePath];
_beginImage = [CIImage imageWithContentsOfURL:fileNameAndPath];
2.创建基于GPU的context对象(类似上下文)
_context = [CIContext contextWithOptions:nil];
3.创建过滤器,过滤器的类型,这里我们首先选用的是一个棕色的滤镜
_filter = [CIFilter filterWithName:@"CISepiaTone"];
4.初始化slider 和 初始化图片,指定需要过滤的图片
_filter setValue:_beginImage forKey:kCIInputImageKey];
5.指定过滤的参数
[_filter setValue:[NSNumber numberWithFloat:sliderValue] forKey:@"inputIntensity"];
CIImage *outputImage = [_filter outputImage];
CGImageRef img = [_context createCGImage:outputImage fromRect:[outputImage extent]];
imageWithCGImage:img];
7.类似绘图,我们需要释放c对象
CGImageRelease(img);
CIHueAdjust,参数为inputAngle。旋转的滤镜类型为CIStraightenFilter,参数为inputAngle。
访问相册,及其选取相册进行滤镜处理
1.访问相册,并且设置代理
*pickerC = [[UIImagePickerController alloc] init];
delegate = self;
[self presentModalViewController:pickerC animated:YES];
2.实现代理方法,把选取的图片作为背景视图进行显示
#pragma mark - UIImagePickerControllerDelegate
//当得到照片或者视频时调用该方法
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
[self dismissModalViewControllerAnimated:YES];
//获取选中图片
UIImage *gotImage = [info objectForKey:UIImagePickerControllerOriginalImage];
_beginImage = [CIImage imageWithCGImage:gotImage.CGImage];
//设置为背景
_imgV.imagegotImage;
}
3.点击cancel时调用的方法
- (void)imagePickerControllerDidCancel:(UIImagePickerController
[self dismissModalViewControllerAnimated:YES];
}
保存功能的实现
- (IBAction)savePhoto:(UIButton
CIImage *saveToSave = [_filter outputImage];
CGImageRef cgimg = [_context createCGImage:saveToSave fromRect:[saveToSave extent]];
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeImageToSavedPhotosAlbum:cgimg metadata:[saveToSave properties] completionBlock:^(NSURL *assetURL, NSError *error) {
CGImageRelease(cgimg);
}];
}