2013-10-08 2 views
1

케이스 1케이스 2 아래 코드와 같이 두 개의 필터 체인을 전환하고 싶습니다. 처음에 두 경우 중 하나를 선택하면 출력이 올바르게 나타납니다. 그러나 다른 필터 체인으로 전환하면 출력이 현재 필터 체인과 이전 필터 체인간에 깜박입니다. 필터 체인을 전환하는 권장 방법은 무엇입니까?GPUImage 프레임 워크를 사용하여 필터 체인 사이를 전환

-(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]; 
} 
+2

이전 필터를 비디오 카메라의 대상으로 제거하거나 이전 필터 체인의 대상으로 비디오보기를 제거하는 것을 보지 못했습니다. 이 작업을 수행하는 방법에 대한 Mac FilterShowcase 예제를 참조하십시오. 또는 비디오가 하나의 소스에서 여러 필터 체인으로 계속 공급됩니다. –

+0

알았습니다. 고맙습니다! – Loozie

답변

11

응용 프로그램의 상황에 따라 GPUImageFilterPipeline 클래스를 고려할 수도 있습니다.

브래드가 참조하는 모든 중간 대상을 추가하고 제거하는 일을 처리합니다.

이러한 필터를 반복적으로 설정/해체하는 것이 문제가되지만 수업 시간 동안 메모리에 유지하는 것이 아니라면 파이프 라인을 감상 할 수 있습니다.

당신이 제공하는 무엇, 그것은 이런 식으로 뭔가 보일 수 있습니다 대략 기반으로 : 나는 동적으로 다음 실행시에 필터 세트를 생성하고있을 때 파이프 라인에 대한

- (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은 경우에 따라 매우 유용 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 재미있는 접근법. – Loozie

+0

아무런 문제없이 행운을 빕니다! –