实现滤镜功能所用了一些简单的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);

    }];

}