如何在UIImage的不同过滤器之间正确交替(GPUImage)

时间:2014-03-03 03:26:19

标签: ios objective-c gpuimage

我正在开发一个过滤应用程序,类似于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中的图像),所以我做错了什么? - 或者是系统的预期性能?

谢谢!

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我有一个类似的应用程序,我做的是我保持我的baseImage在手边,一旦我完成应用过滤器并显示带过滤器的图像我重置一切。当用户选择不同的过滤器时,我再次使用baseImage来创建新过滤的图像并显示它。

所以在这个例子中你可以移动[sourcePicture removeAllTargets];在此之后[self.view addSubview:filterView];

当您想要应用新过滤器时,可以节省您的工作量。此外,当您使用已经存在的图像时,有一种更快(更脏的方式来过滤图片。我从GPUImage附带的文档中得到了这个,它就像一个魅力。

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

希望它可以帮助你。

答案 2 :(得分:0)

使用此方法进行切换过滤,只需在Method

中传递过滤器名称字符串即可
-(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);
}