2016-05-03 75 views
3

我正在研究GPUImage库。我已经设置了该特定的过滤器将应用于Collectionview的didselectitematindexpath方法。这是我第一个基于GPUImage库的项目。我成功地在GPUImageview上应用过滤器,但是它会花费很多时间来应用过滤器。请指导我,我怎样才能让它快速申请。GPUImage花费时间应用过滤器

这里是我的代码,

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
     [filter removeAllTargets]; 

    if (indexPath.row==0) { 
     NSLog(@"Normal Filter"); 
    } 
    else if (indexPath.row==1) 
    { 
     filter = [[GPUImageSepiaFilter alloc] init]; 

    } 
    else if (indexPath.row==2) 
    { 
     filter = [[GPUImagePixellateFilter alloc] init]; 

    } 
    else if (indexPath.row==3) 
    { 
     filter = [[GPUImagePixellatePositionFilter alloc] init]; 

    } 
    else if (indexPath.row==4) 
    { 
     filter = [[GPUImagePolkaDotFilter alloc] init]; 

    } 
    else if (indexPath.row==5) 
    { 
     filter = [[GPUImageHalftoneFilter alloc] init]; 

    } 
    else if (indexPath.row==6) 
    { 
     filter = [[GPUImageCrosshatchFilter alloc] init]; 

    } 
    else if (indexPath.row==7) 
    { 
     filter = [[GPUImageColorInvertFilter alloc] init]; 

    } 
    else if (indexPath.row==8) 
    { 
     filter = [[GPUImageGrayscaleFilter alloc] init]; 

    } 
    else if (indexPath.row==9) 
    { 
     filter = [[GPUImageMonochromeFilter alloc] init]; 
     [(GPUImageMonochromeFilter *)filter setColor:(GPUVector4){0.0f, 0.0f, 1.0f, 1.f}]; 
    } 
    else if (indexPath.row==10) 
    { 
     filter = [[GPUImageFalseColorFilter alloc] init]; 

    } 
    else if (indexPath.row==11) 
    { 
     filter = [[GPUImageSoftEleganceFilter alloc] init]; 

    } 
    else if (indexPath.row==12) 
    { 
     filter = [[GPUImageMissEtikateFilter alloc] init]; 

    } 
    else if (indexPath.row==13) 
    { 
     filter = [[GPUImageAmatorkaFilter alloc] init]; 

    } 
    else if (indexPath.row==14) 
    { 
     filter = [[GPUImageSaturationFilter alloc] init]; 
     [(GPUImageSaturationFilter *)filter setSaturation:2.0]; 
    } 
    else if (indexPath.row==15) 
    { 
     filter = [[GPUImageContrastFilter alloc] init]; 
     [(GPUImageContrastFilter *)filter setContrast:1.5]; 


    } 
    else if (indexPath.row==16) 
    { 
     filter = [[GPUImageBrightnessFilter alloc] init]; 
     [(GPUImageBrightnessFilter *)filter setBrightness:0.6]; 


    } 
    else if (indexPath.row==17) 
    { 
     filter = [[GPUImageLevelsFilter alloc] init]; 

    } 
    else if (indexPath.row==18) 
    { 
     filter = [[GPUImageRGBFilter alloc] init]; 

    } 
    else if (indexPath.row==19) 
    { 
     filter = [[GPUImageHueFilter alloc] init]; 

    } 
    else if (indexPath.row==20) 
    { 
     filter = [[GPUImageWhiteBalanceFilter alloc] init]; 

    } 
    else if (indexPath.row==21) 
    { 
     filter = [[GPUImageExposureFilter alloc] init]; 

    } 
    else if (indexPath.row==22) 
    { 
     filter = [[GPUImageSharpenFilter alloc] init]; 

    } 
    else if (indexPath.row==23) 
    { 
     filter = [[GPUImageUnsharpMaskFilter alloc] init]; 

    } 
    else if (indexPath.row==24) 
    { 
     filter = [[GPUImageGammaFilter alloc] init]; 

    } 
    else if (indexPath.row==25) 
    { 
     filter = [[GPUImageToneCurveFilter alloc] init]; 
     [(GPUImageToneCurveFilter *)filter setBlueControlPoints:[NSArray arrayWithObjects:[NSValue valueWithCGPoint:CGPointMake(0.0, 0.0)], [NSValue valueWithCGPoint:CGPointMake(0.5, 0.5)], [NSValue valueWithCGPoint:CGPointMake(1.0, 0.75)], nil]]; 
    } 
    else if (indexPath.row==26) 
    { 
     filter = [[GPUImageHighlightShadowFilter alloc] init]; 

    } 
    else if (indexPath.row==27) 
    { 
     filter = [[GPUImageHazeFilter alloc] init]; 

    } 
    else if (indexPath.row==28) 
    { 
     filter = [[GPUImageAverageColor alloc] init]; 

    } 
    else if (indexPath.row==29) 
    { 
     filter = [[GPUImageLuminosity alloc] init]; 

    } 
    else if (indexPath.row==30) 
    { 
     filter = [[GPUImageHistogramFilter alloc] initWithHistogramType:kGPUImageHistogramRGB]; 

    } 
    else if (indexPath.row==31) 
    { 
     filter = [[GPUImageLuminanceThresholdFilter alloc] init]; 

    } 
    else if (indexPath.row==32) 
    { 
     filter = [[GPUImageAdaptiveThresholdFilter alloc] init]; 

    } 
    else if (indexPath.row==33) 
    { 
     filter = [[GPUImageAverageLuminanceThresholdFilter alloc] init]; 

    } 
    else if (indexPath.row==34) 
    { 
     filter = [[GPUImageCropFilter alloc] initWithCropRegion:CGRectMake(0.0, 0.0, 1.0, 0.25)]; 
    } 


    [sourcePicture addTarget:filter]; 
    [filter addTarget:self.vwGPUImagview]; 
    [sourcePicture processImage]; 


} 

输出: -

enter image description here

编辑: - 当我写[filter removeAllTarget]一些过滤器不工作。如果我删除它,那么它完全工作。我的错误在哪里?

编辑2: - Demo Link

+0

你还没有真的说过*哪里*事情很慢。他们第一次出现在收藏视图时速度慢吗?他们被选中时速度慢吗?这些图像有多大?您的缩略图是以全分辨率进行过滤还是仅缩略图所需的分辨率降低?另外,我注意到,当你从你的过滤器中删除所有目标时,你似乎并没有从你的重复使用的图像中删除所有目标。这意味着每当您更换新的滤镜时,图像都会被放入不断增加的滤镜列表中。 –

+0

@BradLarson谢谢您的重播。实际上,我临时将过滤器应用于集合视图'cellforitematindexpath'。一旦项目完成,我会将其设置为静态图像。主要问题是当我在'didselectrowatindexpath'中调用动作时,图像会很慢。有问题,我编辑了github链接。我如何努力实现它。 –

回答

5

根据所提供,你在这里做了几件事情,会很慢下来的代码。首先,您有一个显然无用的GPUImageVideoCamera,您可以多次重新创建。这可以被删除。

其次,您每次想要显示单元格时都基于UIImage创建一个新的GPUImagePicture。这将会非常缓慢。相反,尝试使用单个共享图像,并在显示单元时将其交换出来。此外,请使用-forceProcessingAtSize:将过滤器大小限制为单元格中缩略图的大小。过滤巨型图像没有意义,只显示一个小缩略图。

最后,正如我上面指出的那样,每次换入新过滤器时,都会删除过滤器的输出,但不会删除图像。这意味着您交换的每个过滤器都会被添加为图像的输出,但从未删除。您的图像会生成越来越多的输出过滤器列表,并且处理速度会越来越慢。在删除先前过滤器的所有输出的同时,删除图片中的所有输出。

您也可以在您的过滤器上使用-forceProcessingAtSize:,以限制它们仅显示完整显示的大小,这可能仍然比源图像小。

+0

非常感谢您为迟到回复而抱歉。我在gpuimageview中获得小图像。你能帮我解决问题吗? –

+0

谢谢我的问题解决了。你摇滚。 –