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,可以让这变得更容易,尽管我还没有搞乱它们