1. 程式人生 > >用GPUImage給視訊新增多個濾鏡

用GPUImage給視訊新增多個濾鏡

http://www.voidcn.com/blog/u1031/article/p-4178831.html

之前說過要寫的部落格。。關於使用GPUImage來做混合濾鏡和水印等效果;

放了國慶假期之後。。終於想起來要填坑了。。尷尬。。於是現在來簡單說一下GPUImage做混合濾鏡的做法;

其實做混合濾鏡,GPUImage一共有2種做法:一是使用GPUImageFilterGroup, 二是用多個GPUImageFilter來疊合;

這裡先講第一種: GPUImageFilterGroup


GPUImageFilterGroup包括上面幾個屬性和方法;

其中initialFilters指的是資料來源的傳入Filter(比如GPUImageUIElement的target,

GPUImagePicture的target等)

terminalFilter指的是最後的Filter,它的target就是資料的輸出口;

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

第二種方法:

1. 最簡單的Filter是這樣用的:

2. 如果做濾鏡的疊合,其實就是多個Filter串聯在一起:

3. 如果這些濾鏡中,要做混合效果(強光混合之類的,就是需要2個輸入源的話)

這裡給出簡單程式碼:

 <span class="hljs-comment" style="border: 0px; margin: 0px; padding: 0px; font-weight: inherit; font-style: italic; font-family: inherit; vertical-align: baseline; color: rgb(64, 128, 128); background: transparent;">//輸入的資料(image)</span>
    <span class="hljs-built_in" style="border: 0px; margin: 0px; padding: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; vertical-align: baseline; color: rgb(0, 134, 179); background: transparent;">UIImage</span> *img = [<span class="hljs-built_in" style="border: 0px; margin: 0px; padding: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; vertical-align: baseline; color: rgb(0, 134, 179); background: transparent;">UIImage</span> imageNamed:<span class="hljs-string" style="border: 0px; margin: 0px; padding: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; vertical-align: baseline; color: rgb(33, 145, 97); background: transparent;">@"secPersonDemo.png"</span>];
    _pic = [[GPUImagePicture alloc] initWithImage:img];
    
    <span class="hljs-comment" style="border: 0px; margin: 0px; padding: 0px; font-weight: inherit; font-style: italic; font-family: inherit; vertical-align: baseline; color: rgb(64, 128, 128); background: transparent;">//經過的渠道(filter)</span>
    _brightnessFilter = [[GPUImageBrightnessFilter alloc] init];
    [_brightnessFilter setBrightness:<span class="hljs-number" style="border: 0px; margin: 0px; padding: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; vertical-align: baseline; color: rgb(64, 160, 112); background: transparent;">0</span>];
    
    _contrastFilter = [[GPUImageContrastFilter alloc] init];
    [_contrastFilter setContrast:<span class="hljs-number" style="border: 0px; margin: 0px; padding: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; vertical-align: baseline; color: rgb(64, 160, 112); background: transparent;">1.0</span>];
    
    _rgbFilter = [[GPUImageToneCurveFilter alloc] init];
    
    _blurFilter = [[GPUImageiOSBlurFilter alloc] init];
    [_blurFilter setBlurRadiusInPixels:-<span class="hljs-number" style="border: 0px; margin: 0px; padding: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; vertical-align: baseline; color: rgb(64, 160, 112); background: transparent;">12.0</span>f];
    
    _vignetteFilter = [[GPUImageVignetteFilter alloc] init];
    
    _bilateralFilter = [[GPUImageBilateralFilter alloc] init];
    [_bilateralFilter setFirstDistanceNormalizationFactorUniform:<span class="hljs-number" style="border: 0px; margin: 0px; padding: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; vertical-align: baseline; color: rgb(64, 160, 112); background: transparent;">15</span>];
    [_bilateralFilter setSecondDistanceNormalizationFactorUniform:<span class="hljs-number" style="border: 0px; margin: 0px; padding: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; vertical-align: baseline; color: rgb(64, 160, 112); background: transparent;">25</span>];
    
    _rgbOpeningFilter = [[GPUImageRGBOpeningFilter alloc] initWithRadius:<span class="hljs-number" style="border: 0px; margin: 0px; padding: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; vertical-align: baseline; color: rgb(64, 160, 112); background: transparent;">0.2</span>];
    
    _saturationFilter = [[GPUImageSaturationFilter alloc] init];
    
    _softLightBlendFilter = [[GPUImageSoftLightBlendFilter alloc] init];
    
    _pict = [[GPUImagePicture alloc] initWithImage:[<span class="hljs-built_in" style="border: 0px; margin: 0px; padding: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; vertical-align: baseline; color: rgb(0, 134, 179); background: transparent;">UIImage</span> imageNamed:<span class="hljs-string" style="border: 0px; margin: 0px; padding: 0px; font-weight: inherit; font-style: inherit; font-family: inherit; vertical-align: baseline; color: rgb(33, 145, 97); background: transparent;">@"blend.png"</span>]];
    
    
    <span class="hljs-comment" style="border: 0px; margin: 0px; padding: 0px; font-weight: inherit; font-style: italic; font-family: inherit; vertical-align: baseline; color: rgb(64, 128, 128); background: transparent;">//設定連線(target)</span>
    [_pic addTarget:_rgbFilter];
    [_rgbFilter addTarget:_contrastFilter];
    [_contrastFilter addTarget:_brightnessFilter];
    [_brightnessFilter addTarget:_bilateralFilter];
    <span class="hljs-comment" style="border: 0px; margin: 0px; padding: 0px; font-weight: inherit; font-style: italic; font-family: inherit; vertical-align: baseline; color: rgb(64, 128, 128); background: transparent;">//[_blurFilter addTarget:_vignetteFilter];</span>
    <span class="hljs-comment" style="border: 0px; margin: 0px; padding: 0px; font-weight: inherit; font-style: italic; font-family: inherit; vertical-align: baseline; color: rgb(64, 128, 128); background: transparent;">//[_vignetteFilter addTarget:_imageview];</span>
    <span class="hljs-comment" style="border: 0px; margin: 0px; padding: 0px; font-weight: inherit; font-style: italic; font-family: inherit; vertical-align: baseline; color: rgb(64, 128, 128); background: transparent;">//[_vignetteFilter addTarget:_bilateralFilter];</span>
    [_bilateralFilter addTarget:_rgbOpeningFilter];
    [_rgbOpeningFilter addTarget:_saturationFilter];
    <span class="hljs-comment" style="border: 0px; margin: 0px; padding: 0px; font-weight: inherit; font-style: italic; font-family: inherit; vertical-align: baseline; color: rgb(64, 128, 128); background: transparent;">//[_saturationFilter addTarget:_imageview];</span>
    
    [_saturationFilter addTarget:_softLightBlendFilter];
    [_pict addTarget:_softLightBlendFilter];
    
    [_softLightBlendFilter addTarget:_imageview];<span class="hljs-comment" style="border: 0px; margin: 0px; padding: 0px; font-weight: inherit; font-style: italic; font-family: inherit; vertical-align: baseline; color: rgb(64, 128, 128); background: transparent;">//_imageview是一個GPUImageView,用來顯示結果的</span>
    
    [_pict processImage];
    [_pic processImage];