Iphone 如何禁用GPUImageGrayscaleFilter

Iphone 如何禁用GPUImageGrayscaleFilter,iphone,ios,cocoa-touch,gpuimage,Iphone,Ios,Cocoa Touch,Gpuimage,我已将GPUImageGrayscaleFilter与其他一些过滤器连接在一起,如下所示: [self.image addTarget:self.sepiaFilter]; [self.sepiaFilter addTarget:self.brightnessFilter]; [self.brightnessFilter addTarget:self.grayscaleFilter]; [self.grayscaleFilter addTarget:self.imageView]; [self.

我已将
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;

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

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

这就是我对过滤器链所做的操作:

- (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];
}
-(无效)链过滤器
{
[self.gpuImage removeAllTargets];
Filter*previousFilter=nil,*firstFilter=nil;
对于(int i=0;i<[self.filters count];i++)
{
Filter*currentFilter=[[self.filters objectAtIndex:i]retain];
[currentFilter.filter removeAllTargets];
如果([currentFilter applied])
{
如果(!firstFilter)
{
firstFilter=[currentFilter retain];
}
如果(以前的过滤器)
{
[previousFilter.filter addTarget:currentFilter.filter];
[先前的过滤器释放];
}
previousFilter=[currentFilter retain];
}
[当前过滤器释放];
}
if(firstFilter!=nil)
{
[self.gpuImage addTarget:firstFilter.filter];
[previousFilter.filter addTarget:self.gpuImageView];
}
其他的
{
[self.gpuImage addTarget:self.gpuImageView];
}
[先前的过滤器释放];
[第一过滤器释放];
}
其中Filter是GPUImageFilter的包装类。每次过滤器更改时,我都会应用此选项。不知道它是否是最有效的,但它完成了任务。我认为GPUImage中还有其他一些类,比如FilterGroup和FilterPipeline,可以让这变得更容易,尽管我还没有搞乱它们