2

以下のコードを使用して、ケース 1ケース 2に示すように、2 つのフィルター チェーンを切り替えたいと思います。最初にどちらかのケースを選択すると、出力は正しく表示されます。ただし、別のフィルター チェーンに切り替えると、現在のフィルター チェーンと前のフィルター チェーンの間で出力がちらつきます。フィルター チェーンを切り替える推奨される方法は何ですか?

-(void) updateFilter:(NSInteger) style {
switch (style) {
    case 1:
        [kuwahara setRadius:5];
        [videoCamera addTarget:kuwahara];
        [kuwahara addTarget:grayscale];
        [grayscale addTarget:filteredVideoView];
        break;
    case 2:    
        [videoCamera addTarget:grayscale];
        [blur setBlurSize:3];
        [grayscale addTarget:blur];
        [blur addTarget:colorinvert];
        [colorinvert addTarget:filteredVideoView];
        break;
    default:
        [videoCamera addTarget:filteredVideoView];
        break;
}
[videoCamera startCameraCapture];
}  
4

1 に答える 1

11

アプリの状況によっては、GPUImageFilterPipeline クラスも検討する必要がある場合があります。

Brad が参照しているすべての介在ターゲットの追加と削除を処理します。

これらのフィルターのセットアップ/ティアダウンを繰り返すことが問題であるが、クラスの存続期間中はメモリ内に保持することは問題ではない場合は、パイプラインを高く評価する場合があります。

あなたが提供したものに大まかに基づいて、次のようになります。

- (void)configureSomeArraysOfFilters {
    _setNumberOne = [[NSMutableArray alloc] init]; //make sure these arrays are at least scoped to the class, if not actual @properties
    GPUImageKuwaharaFilter* kuwahara = [[GPUImageKuwaharaFilter alloc] init];
    [kuwahara setRadius:5];
    GPUImageGrayscaleFilter* gray = [[GPUImageGrayscaleFilter alloc] init];
    [_setNumberOne addObject:kuwahara];
    [_setNumberOne addObject:gray];


    _setNumberTwo = [[NSMutableArray alloc] init];
    GPUImageGrayscaleFilter* otherGray = [[GPUImageGrayscaleFilter alloc] init];
    GPUImageGaussianBlurFilter* blur = [[GPUImageGaussianBlurFilter alloc] init];
    [blur setBlurSize:3];
    GPUImageColorInvertFilter* invert = [[GPUImageColorInvertFilter alloc] init];
    [_setNumberTwo addObject:otherGray];
    [_setNumberTwo addObject:blur];
    [_setNumberTwo addObject:invert];
}

- (void)configureAnEmptyPipeline {
    if (_samplePipeline == nil) {
        GPUImageFilter* passthrough = [[GPUImageFilter alloc] init];
        NSArray* empty = [NSArray arrayWithObjects:passthrough, nil];
        _samplePipeline = [[GPUImageFilterPipeline alloc] initWithOrderedFilters:empty input:videoCamera output:_filteredVideoView];
        [videoCamera startCameraCapture];
    }
}

- (void)updateFilterPipeline:(NSInteger)style {
    switch (style) {
        case 1:
            [_samplePipeline replaceAllFilters:_setNumberOne];
            break;

        case 2:
            [_samplePipeline replaceAllFilters:_setNumberTwo];

        //add as many more cases as you have defined Arrays full of filters for

        default:
            break;
    }
}

ただし、パイプラインの私のお気に入りの使用例は、実行時に一連のフィルターを動的に作成し、それらをアクションに切り替える場合です。これにより、フィルターを順番に保存してパイプラインに渡すだけで済み、各フィルター間のすべてのターゲティングを毎回指定する必要がなくなります。

すべての状況に適しているわけではありませんが、状況によっては GPUImageFilterPipeline が非常に役立つ場合があります。

于 2013-10-15T03:28:25.457 に答える