用GPUImage做难一点点的效果

之前说过要写的博客。。关于使用GPUImage来做混合滤镜和水印等效果;

放了国庆假期之后。。终于想起来要填坑了。。。。于是现在来简单说一下GPUImage做混合滤镜的做法;

其实做混合滤镜,GPUImage一共有2种做法:一是使用GPUImageFilterGroup, 二是用多个GPUImageFilter来叠合;

这里先讲第一种: GPUImageFilterGroup

用GPUImage做难一点点的效果_第1张图片

GPUImageFilterGroup包括上面几个属性和方法;

其中initialFilters指的是数据源的传入Filter(比如GPUImageUIElement的target,GPUImagePicture的target等)

terminalFilter指的是最后的Filter,它的target就是数据的输出口;

具体可以看GPUImage的官方例子:FilterShowcase

第二种方法:

1. 最简单的Filter是这样用的:

用GPUImage做难一点点的效果_第2张图片

2. 如果做滤镜的叠合,其实就是多个Filter串联在一起:

用GPUImage做难一点点的效果_第3张图片

3. 如果这些滤镜中,要做混合效果(强光混合之类的,就是需要2个输入源的话)

用GPUImage做难一点点的效果_第4张图片

这里给出简单代码:

 //输入的数据(image)
    UIImage *img = [UIImage imageNamed:@"secPersonDemo.png"];
    _pic = [[GPUImagePicture alloc] initWithImage:img];
    
    //经过的渠道(filter)
    _brightnessFilter = [[GPUImageBrightnessFilter alloc] init];
    [_brightnessFilter setBrightness:0];
    
    _contrastFilter = [[GPUImageContrastFilter alloc] init];
    [_contrastFilter setContrast:1.0];
    
    _rgbFilter = [[GPUImageToneCurveFilter alloc] init];
    
    _blurFilter = [[GPUImageiOSBlurFilter alloc] init];
    [_blurFilter setBlurRadiusInPixels:-12.0f];
    
    _vignetteFilter = [[GPUImageVignetteFilter alloc] init];
    
    _bilateralFilter = [[GPUImageBilateralFilter alloc] init];
    [_bilateralFilter setFirstDistanceNormalizationFactorUniform:15];
    [_bilateralFilter setSecondDistanceNormalizationFactorUniform:25];
    
    _rgbOpeningFilter = [[GPUImageRGBOpeningFilter alloc] initWithRadius:0.2];
    
    _saturationFilter = [[GPUImageSaturationFilter alloc] init];
    
    _softLightBlendFilter = [[GPUImageSoftLightBlendFilter alloc] init];
    
    _pict = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"blend.png"]];
    
    
    //设置连接(target)
    [_pic addTarget:_rgbFilter];
    [_rgbFilter addTarget:_contrastFilter];
    [_contrastFilter addTarget:_brightnessFilter];
    [_brightnessFilter addTarget:_bilateralFilter];
    //[_blurFilter addTarget:_vignetteFilter];
    //[_vignetteFilter addTarget:_imageview];
    //[_vignetteFilter addTarget:_bilateralFilter];
    [_bilateralFilter addTarget:_rgbOpeningFilter];
    [_rgbOpeningFilter addTarget:_saturationFilter];
    //[_saturationFilter addTarget:_imageview];
    
    [_saturationFilter addTarget:_softLightBlendFilter];
    [_pict addTarget:_softLightBlendFilter];
    
    [_softLightBlendFilter addTarget:_imageview];//_imageview是一个GPUImageView,用来显示结果的
    
    [_pict processImage];
    [_pic processImage];


你可能感兴趣的:(iOS)