用GPUImage給視訊新增多個濾鏡
阿新 • • 發佈:2018-12-31
http://www.voidcn.com/blog/u1031/article/p-4178831.html
之前說過要寫的部落格。。關於使用GPUImage來做混合濾鏡和水印等效果;
放了國慶假期之後。。終於想起來要填坑了。。。。於是現在來簡單說一下GPUImage做混合濾鏡的做法;
其實做混合濾鏡,GPUImage一共有2種做法:一是使用GPUImageFilterGroup, 二是用多個GPUImageFilter來疊合;
這裡先講第一種: GPUImageFilterGroup
GPUImageFilterGroup包括上面幾個屬性和方法;
其中initialFilters指的是資料來源的傳入Filter(比如GPUImageUIElement的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];