iOS 一步搞定图片渲染效果

自定义一个简单类,需要时候调用即可,直接上代码

#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的计数并不能释放他的内存

posted on 2016-04-08 17:58  durantm  阅读(1095)  评论(0编辑  收藏  举报

导航