0

我已经附加GPUImageGrayscaleFilter了一些其他过滤器的链,如下所示:

[self.image addTarget:self.sepiaFilter];
[self.sepiaFilter addTarget:self.brightnessFilter];
[self.brightnessFilter addTarget:self.grayscaleFilter];
[self.grayscaleFilter addTarget:self.imageView];
[self.image processImage];

我想知道,是否可以执行以下操作:

grayscaleFilter.shutoff = YES;

我希望我的用户能够打开或关闭灰度。我想知道我是否可以在不必将其从链中删除的情况下完成此操作?

4

2 回答 2

0

您无法完成我想要的上述操作,必须GPUImageGrayscaleFilter从过滤器链中删除才能将其删除。

于 2013-08-08T12:09:57.787 回答
0

这就是我为链接过滤器所做的事情:

- (void) chainFilters
{
    [self.gpuImage removeAllTargets];

    Filter *previousFilter = nil, *firstFilter = nil;

    for (int i = 0; i < [self.filters count]; i++)
    {
        Filter *currentFilter = [[self.filters objectAtIndex:i] retain];
        [currentFilter.filter removeAllTargets];

        if ([currentFilter applied])
        {
            if (!firstFilter)
            {
                firstFilter = [currentFilter retain];
            }

            if (previousFilter)
            {
                [previousFilter.filter addTarget:currentFilter.filter];
                [previousFilter release];
            }

            previousFilter = [currentFilter retain];
        }

        [currentFilter release];
    }

    if (firstFilter != nil)
    {
        [self.gpuImage addTarget:firstFilter.filter];
        [previousFilter.filter addTarget:self.gpuImageView];
    }
    else
    {
        [self.gpuImage addTarget:self.gpuImageView];
    }

    [previousFilter release];
    [firstFilter release];
}

其中 Filter 是 GPUImageFilter 的包装类。每次过滤器更改时我都会应用它。不知道它是否是最有效的,但它可以完成工作。我认为 GPUImage 中还有其他一些类,例如 FilterGroup 和 FilterPipeline,尽管我还没有弄乱它们,但它们使这更容易。

于 2013-08-08T22:48:52.300 回答