2016-05-03 14 views
3

私はGPUImageライブラリで作業しています。 Collectionviewのdidselectitematindexpathメソッドにその特定のフィルタを適用するように設定しました。これはGPUImageライブラリに基づいた私の最初のプロジェクトです。私はGPUImageviewでFilterを適用することに成功しましたが、フィルタを適用するのに多くの時間がかかります。私を案内してください、どうすれば応募を迅速にすることができますか?ここで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

EDIT: - 私は[filter removeAllTarget]を書くとき、いくつかのフィルタが働いていませんでした。私がそれを取り除くと、それは完全に働いた。私のミスはどこですか?

EDIT 2: - Demo Link

+0

あなたは本当に*どこが遅いのかは実際には述べていません。コレクションビューに最初に表示されるときに時間がかかりますか?彼らは選択されたときに遅くなりますか?これらの画像の大きさはどれくらいですか?サムネイルはフル解像度でフィルタリングされていますか、縮小された解像度のみがサムネイルに必要ですか?また、フィルタからすべてのターゲットを削除している間は、再利用されたイメージからすべてのターゲットを削除しているようには見えません。つまり、新しい画像に変更するたびに、フィルタのリストに画像が追加されます。 –

+0

@BradLarson再生していただきありがとうございます。実際、私はフィルタを 'cellforitematindexpath'コレクションビューに一時的に適用しました。プロジェクトが完了したら、それを静止画として設定します。主な問題は、 'didselectrowatindexpath'でアクションを呼び出すとイメージが遅くなることです。質問で私はgithubのリンクを編集しました。どのように私はそれを達成しようとした。 –

答えて

5

提供されたコードに基づいて、あなたは本当にこの速度が遅くなり、ここでいくつかのことをやっています。まず、何度も再作成するGPUImageVideoCameraがあります。それは取り除くことができます。

次に、セルを表示するたびに、UIImageに基づいて新しいGPUImagePictureを作成します。それは本当に遅くなるでしょう。代わりに、単一の共有イメージを使用して、セルが表示されたら交換してください。また、フィルターサイズを-forceProcessingAtSize:を使用してセル内のサムネイルのサイズに制限します。巨大な画像をフィルタリングする意味がなく、小さなサムネイルを表示するだけです。

最後に、先に指摘したように、新しいフィルタを交換するたびに、フィルタの出力は削除されますが、画像は削除されません。つまり、スワップする各フィルタは画像の出力として追加されますが、削除されることはありません。あなたの画像は、出力フィルタのリストが増え、処理が遅くなり、処理が遅くなります。以前のフィルタからすべての出力を削除すると同時に、画像からすべての出力を削除します。

フィルタには-forceProcessingAtSize:を使用してフルディスプレイのサイズに制限することもできますが、それでもソース画像よりも小さい場合があります。

+0

返信いただきありがとうございます。私はgpuimageviewで小さな画像を取得しています。問題を解決するのを助けてくれますか? –

+0

私の問題は解決されました。あなたは揺れる。 –

関連する問題