在swift中使用GPUImage链接过滤器

时间:2014-12-18 11:52:47

标签: ios swift gpuimage

(Stack Overflow的第一篇文章 - 所以,嗨,紧张地挥动')

我使用GPUImage库取得了一些成功 - 并设法使用swift获得了一个处理静态图像的简单过滤器。

但是我在尝试将多个过滤器链接在一起时遇到了问题。图书馆中包含的示例似乎并未涵盖此内容。有很多客观的C例子,但不是很快。

任何人都可以举一个如何申请的例子:

2个混合滤镜加上亮度,对比度和饱和度滤镜到单个静态图像?

我认为这足以涵盖Swift中库的大多数用途。感谢。

2 个答案:

答案 0 :(得分:4)

在Swift中分配和链接过滤器与在Objective-C中相同,它只是语法转换。例如,以下是如何将两个静止图像输入链接到Objective-C中的混合滤镜,然后将该混合的结果定向到对比度滤镜,捕获最终图像:

GPUImageOverlayBlendFilter *blendFilter = [[GPUImageOverlayBlendFilter alloc] init];
[stillImageSource1 addTarget:blendFilter];
[stillImageSource2 addTarget:blendFilter];

GPUImageContrastFilter *contrastFilter = [[GPUImageContrastFilter alloc] init];
[blendFilter addTarget:contrastFilter];

[contrastFilter useNextFrameForImageCapture];
[stillImageSource1 processImage];
[stillImageSource2 processImage];

UIImage *currentFilteredImage = [contrastFilter imageFromCurrentFramebuffer];

这与Swift相同:

let blendFilter = GPUImageOverlayBlendFilter()
stillImageSource1.addTarget(blendFilter)
stillImageSource2.addTarget(blendFilter)

let contrastFilter = GPUImageContrastFilter()
blendFilter.addTarget(contrastFilter)

contrastFilter.useNextFrameForImageCapture()
stillImageSource1.processImage()
stillImageSource2.processImage()

let currentFilteredImage = contrastFilter.imageFromCurrentFramebuffer()

正如您所看到的,它是所有语法,在您实际调用内容方面没有任何不同。您可以使用Objective-C示例代码作为您想要执行的操作的基础,并在Swift等效项中重写它。我随框架提供的Swift示例要么非常简单(在实时视频上使用单个过滤器的小应用程序),要么相当复杂(我的测试用例应用程序执行框架中的每个过滤器和操作)。

答案 1 :(得分:1)

当您使用演示中的FilterOperations.swift类时,您可以像这样初始化过滤器:

// Quick reference to the used filter configurations
var filterExposure = filterOperations.firstMatch {item in return item.listName == "Exposure"}!
var filterHighlightShadow = filterOperations.firstMatch {item in return item.listName == "Highlights and shadows"}!
var filterSaturation = filterOperations.firstMatch {item in return item.listName == "Saturation"}!
var filterContrast  = filterOperations.firstMatch {item in return item.listName == "Contrast"}!
var filterAdaptiveThreshold  = filterOperations.firstMatch {item in return item.listName == "Adaptive threshold"}!

然后像这样设置这些过滤器:

    (self.filterExposure.filter as GPUImageExposureFilter).exposure = 0.8 // -10 - 10
    (self.filterHighlightShadow.filter as GPUImageHighlightShadowFilter).highlights = 1.0 // 0 - 1
    (self.filterSaturation.filter as GPUImageSaturationFilter).saturation = 0.0 // 0 - 2
    (self.filterContrast.filter as GPUImageContrastFilter).contrast = 2.0  // 0 - 4
    (self.filterAdaptiveThreshold.filter as GPUImageAdaptiveThresholdFilter).blurRadiusInPixels = 8.0

然后你可以像这样链接过滤器:

    videoCamera.addTarget((self.filterExposure.filter as GPUImageInput))
    self.filterExposure.filter.addTarget((self.filterHighlightShadow.filter as GPUImageInput))
    self.filterHighlightShadow.filter.addTarget((self.filterSaturation.filter as GPUImageInput))
    self.filterSaturation.filter.addTarget((self.filterContrast.filter as GPUImageInput))
    self.filterContrast.filter.addTarget((self.filterAdaptiveThreshold.filter as GPUImageInput))
    self.filterAdaptiveThreshold.filter.addTarget(self.filterView)