自定义一个简单类,需要时候调用即可,直接上代码
#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的计数并不能释放他的内存