Ios 如何在UIImage(GPUImage)的不同过滤器之间正确切换

Ios 如何在UIImage(GPUImage)的不同过滤器之间正确切换,ios,objective-c,gpuimage,Ios,Objective C,Gpuimage,我正在开发一个过滤应用程序,类似于GPUImage的“filterShowCase”项目,但我专注于过滤静态图像(从用户库中选择)。主视图显示imagepicker选择的图像,如下所示: sourcePicture = [[GPUImagePicture alloc] initWithImage:sourceImage smoothlyScaleOutput:YES]; filter = [[GPUImageSepiaFilter alloc] init]; filterView = [[GP

我正在开发一个过滤应用程序,类似于GPUImage的“filterShowCase”项目,但我专注于过滤静态图像(从用户库中选择)。主视图显示imagepicker选择的图像,如下所示:

sourcePicture = [[GPUImagePicture alloc] initWithImage:sourceImage smoothlyScaleOutput:YES];
filter = [[GPUImageSepiaFilter alloc] init];

filterView = [[GPUImageView alloc]initWithFrame:self.view.frame];
    filterView.contentMode = UIViewContentModeScaleAspectFit;
    filterView.clipsToBounds = YES;

//Setup targets
[sourcePicture addTarget:filter];
[filter addTarget:filterView];
[sourcePicture processImage];

[self.view addSubview:filterView];
这一切都是可行的,图像是用深褐色过滤的。我允许用户根据用户输入更改过滤器,目的是在不同的过滤器之间快速切换-这都是在switch语句中完成的

switch (filterNumber)
    {
case GPUIMAGE_SEPIA:
        {
            self.title = @"Sepia Tone";


            filter = [[GPUImageSepiaFilter alloc] init];
        }; break;
//a bunch of other filters...

}
    [sourcePicture removeAllTargets];
    [sourcePicture addTarget:filter];
    [filter addTarget:filterView];
    [sourcePicture processImage];
这(^)是我正在使用的当前过程,但是在选择过滤器类型和实际修改图像以匹配该过滤器之间有一个很小的时间间隔

我以前尝试过只做
[sourcePicture processImage]
,但没有成功(没有更改GPUImageView中的图像),那么我做错了什么还是系统的预期性能

谢谢

回答
看看Brad Larsons对这个问题的评论。

我有一个类似的应用程序,我所做的就是把我的基本图像放在手边,一旦我应用了过滤器并用过滤器显示了图像,我就会重置一切。当用户选择不同的过滤器时,我再次使用baseImage创建新的过滤图像并显示它

因此,在本例中,您可以移动[sourcePicture removeAllTargets];在此[self.view addSubview:filterView]之后的右边

当您要应用新过滤器时,这将节省您的工作。另外,当你处理一张已经存在的图片时,有一种更快(更脏)的方法来过滤图片。我从GPUImage附带的文档中得到了这个方法,它就像一个符咒一样工作

GPUImageSketchFilter *stillImageFilter2 = [[GPUImageSketchFilter alloc] init];
tmp = [stillImageFilter2 imageByFilteringImage:[self baseImage]];
[self.imageView setImage: tmp];
tmp = nil;

希望它对您有所帮助。

使用此方法进行切换筛选,只需在方法中传递筛选名称字符串即可

-(void)filterImage:(NSString *)aStrFilterOption {


    CIImage *_inputImage = [CIImage imageWithCGImage:[imgOriginal CGImage]];
    CIFilter *filter = [CIFilter filterWithName:aStrFilterOption];
    [filter setValue:_inputImage forKey:kCIInputImageKey];

    CGImageRef moi3 = [[CIContext contextWithOptions:nil]
                       createCGImage:filter.outputImage
                       fromRect:_inputImage.extent];
    imgView.image = [UIImage imageWithCGImage:moi3];
    CFRelease(moi3);
}

正如Brad Larson所写,使用[filter forceProcessingAtSize]将减少过滤器的执行时间。

我不太确定你在回答的第一部分中的意思(你能详细说明吗?).关于第二部分-我已经尝试了ImageByFilterImageMethod。它不仅运行速度没有明显提高,而且也不适合我的应用程序,因为用户还可以选择更改过滤器属性(例如亮度过滤器的亮度值)。如果用户稍微更改当前活动筛选器的属性,则创建新的uiimage是没有意义的。谢谢,但我使用的是GPUImage和GPUImageView,因此我认为您的代码不适用于框架。您是否尝试过使用GPUImageView的像素大小使用
-forceProcessingAtSize:
,以便您只是一个筛选器显示尽可能多的像素?这可能有助于加快速度。