iOS开发之GPUImage(二)—混合滤镜

前言

本片为GPUImage系列的第二篇,混合滤镜,本篇文章将从两种方式讲解GPUImage混合滤镜的使用。
本文系列第一篇:初见篇已经完结,感兴趣可以看看:
iOS开发之GPUImage(一)—初探(给相机加滤镜)

正文

GPUImage混合滤镜顾名思义即多种滤镜效果组合使用。就像我们为镜头加一个单独的光亮效果或者怀旧效果,如果想要同时为镜头添加上述两种或者多种滤镜,我们就要用到组合滤镜了。
GPUImage所提供的混合滤镜有两种方式:

  • GPUImageFilterGroup
  • GPUImageFilterPipeline
使用GPUImageFilterGroup混合滤镜的步骤如下:

1)初始化要加载滤镜的GPUImagePicture对象initWithImage: smoothlyScaleOutput:
2)初始化多个要被使用的单独的GPUImageFilter滤镜
3)初始化GPUImageFilterGroup对象
4)将FilterGroup加在之前初始化过的GPUImagePicture上
5)将多个滤镜加在FilterGroup中(此处切记一定要设置好设置FilterGroup的初始滤镜和末尾滤镜)
6)之前初始化过的GPUImagePicture处理图片 processImage
7)拿到处理后的UIImage对象图片imageFromCurrentFramebuffer

废话少说上代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //加载一个UIImage对象
    UIImage *image = [UIImage imageNamed:@"image.jpg"];
    
    //初始化GPUImagePicture
    _picture = [[GPUImagePicture alloc] initWithImage:image smoothlyScaleOutput:YES];
    
    //反色滤镜
    GPUImageColorInvertFilter *invertFilter = [[GPUImageColorInvertFilter alloc] init];
    
    //伽马线滤镜
    GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc]init];
    gammaFilter.gamma = 0.2;
    
    //曝光度滤镜
    GPUImageExposureFilter *exposureFilter = [[GPUImageExposureFilter alloc]init];
    exposureFilter.exposure = -1.0;
    
    //怀旧
    GPUImageSepiaFilter *sepiaFilter = [[GPUImageSepiaFilter alloc] init];
    
    /*
     *FilterGroup的方式混合滤镜
     */
    //初始化GPUImageFilterGroup
    self.myFilterGroup = [[GPUImageFilterGroup alloc] init];
    //将滤镜组加在GPUImagePicture上
    [_picture addTarget:self.myFilterGroup];
    //将滤镜加在FilterGroup中
    [self addGPUImageFilter:invertFilter];
    [self addGPUImageFilter:gammaFilter];
    [self addGPUImageFilter:exposureFilter];
    [self addGPUImageFilter:sepiaFilter];
    //处理图片
    [_picture processImage];
    [self.myFilterGroup useNextFrameForImageCapture];
    //拿到处理后的图片
    UIImage *dealedImage = [self.myFilterGroup imageFromCurrentFramebuffer];
    self.myImageView.image = dealedImage;
}

#pragma mark 将滤镜加在FilterGroup中并且设置初始滤镜和末尾滤镜
- (void)addGPUImageFilter:(GPUImageFilter *)filter{
    
    [self.myFilterGroup addFilter:filter];
    
    GPUImageOutput<GPUImageInput> *newTerminalFilter = filter;
    
    NSInteger count = self.myFilterGroup.filterCount;
    
    if (count == 1)
    {
        //设置初始滤镜
        self.myFilterGroup.initialFilters = @[newTerminalFilter];
        //设置末尾滤镜
        self.myFilterGroup.terminalFilter = newTerminalFilter;
        
    } else
    {
        GPUImageOutput<GPUImageInput> *terminalFilter    = self.myFilterGroup.terminalFilter;
        NSArray *initialFilters                          = self.myFilterGroup.initialFilters;
        
        [terminalFilter addTarget:newTerminalFilter];
        
        //设置初始滤镜
        self.myFilterGroup.initialFilters = @[initialFilters[0]];
        //设置末尾滤镜
        self.myFilterGroup.terminalFilter = newTerminalFilter;
    }
}

使用GPUImageFilterPipeline混合滤镜的步骤如下:

1)初始化要加载滤镜的GPUImagePicture对象initWithImage: smoothlyScaleOutput:
2)初始化GPUImageView并加在自己的UIImageView对象上
3)初始化多个要被使用的单独的GPUImageFilter滤镜
4)把多个单独的滤镜对象放到数组中
5)初始化创建GPUImageFilterPipeline对象initWithOrderedFilters: input: output:

参数1:滤镜数组
参数2:GPUImagePicture对象
参数3:GPUImageOutput对象如:GPUImageView

6)之前初始化过的GPUImagePicture处理图片 processImage
7)拿到处理后的UIImage对象图片currentFilteredFrame

废话少说上代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //加载一个UIImage对象
    UIImage *image = [UIImage imageNamed:@"image.jpg"];
    
    //初始化GPUImagePicture
    _picture = [[GPUImagePicture alloc] initWithImage:image smoothlyScaleOutput:YES];
    
    //反色滤镜
    GPUImageColorInvertFilter *invertFilter = [[GPUImageColorInvertFilter alloc] init];
    
    //伽马线滤镜
    GPUImageGammaFilter *gammaFilter = [[GPUImageGammaFilter alloc]init];
    gammaFilter.gamma = 0.2;
    
    //曝光度滤镜
    GPUImageExposureFilter *exposureFilter = [[GPUImageExposureFilter alloc]init];
    exposureFilter.exposure = -1.0;
    
    //怀旧
    GPUImageSepiaFilter *sepiaFilter = [[GPUImageSepiaFilter alloc] init];

    /*
     *GPUImageFilterPipeline的方式混合滤镜
     */
    //初始化myGpuImageView
    _myGpuImageView = [[GPUImageView alloc] initWithFrame:self.myImageView.bounds];
    [self.myImageView addSubview:self.myGpuImageView];
    
    //把多个滤镜对象放到数组中
    NSMutableArray *filterArr = [NSMutableArray array];
    [filterArr addObject:invertFilter];
    [filterArr addObject:gammaFilter];
    [filterArr addObject:exposureFilter];
    [filterArr addObject:sepiaFilter];
    
    //创建GPUImageFilterPipeline对象
    GPUImageFilterPipeline *filterPipline = [[GPUImageFilterPipeline alloc] initWithOrderedFilters:filterArr input:_picture output:self.myGpuImageView];
    
    //处理图片
    [_picture processImage];
    [sepiaFilter useNextFrameForImageCapture];
    
    //拿到处理后的图片
    UIImage *dealedImage = [filterPipline currentFilteredFrame];

效果图如下:


混合滤镜.png

源码已上传至fenglinyunshi-git,欢迎下载,并提出宝贵意见。

结语

本篇主要讲解了GPUImage框架混合滤镜的两种用法,同样的做法同样可以运用到给相机加滤镜的应用场景中。

未完待续...

博观而约取,厚积而薄发。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容