自定义一个简单类,需要时候调用即可,直接上代码
#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface CIFilterEffect : NSObject - (instancetype)initWithImage:(UIImage *)image filterName:(NSString *)name; @property (nonatomic, strong) UIImage *result; @end
ps: 这里设置的属性是给controller取值用,初始化方法传入的是uiimage对象和filter的特定字符串,这个name表示渲染效果
- (instancetype)initWithImage:(UIImage *)image filterName:(NSString *)name { self = [super init]; if (self) { // 将UIImage转换成CIImage CIImage *ciImage = [[CIImage alloc] initWithImage:image]; // 创建滤镜 CIFilter *filter = [CIFilter filterWithName:name keysAndValues:kCIInputImageKey, ciImage, nil]; [filter setDefaults]; // 获取绘制上下文 CIContext *context = [CIContext contextWithOptions:nil]; // 渲染并输出CIImage CIImage *outputImage = [filter outputImage]; // 创建CGImage句柄 CGImageRef cgImage = [context createCGImage:outputImage fromRect:[outputImage extent]]; _result = [UIImage imageWithCGImage:cgImage]; // 释放CGImage句柄 CGImageRelease(cgImage); } return self; }
ps: 这个是.m文件的实现部分,没有其他东西
下面附一个简单效果,代码写在viewcontroller里面即可
- (void)CIFilterEffect { UIImage *image = [[CIFilterEffect alloc] initWithImage:[UIImage imageNamed:@"image.jpg"] filterName:@"CISRGBToneCurveToLinear"].result; UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; [self.view addSubview:imageView]; }
ps : - (void)CIFilterEffect 这个方法是我自定义的,在viewdidiload里面调用就可以了。非常的简单,如果完全照搬上面代码就可以实现渲染图片了。
小结: 以上代码比较简单,自定义类里面的实现其实写的不是特别标准,逻辑上没问题,在苹果官方文档里上下文的创建是第一步 就这点差别吧。
渲染并不是个难点,搞清楚个中逻辑就ok。
还有别忘了,末尾的release,虽然省略不影响程序的运行,但是即使在arc下还是需要添加,因为实际上CI 是c方法,oc的计数并不能释放他的内存