2012-08-13 1 views
5

여러 코어 이미지 필터가있는 프로젝트가 있는데, 각각 다른 슬라이더에 연결되어 있습니다. 모든 것은 작동하지만 한 필터에서 다음 필터로 결과를 전달하는 가장 좋은 방법을 찾지 못했습니다. 각 슬라이더는 다른 슬라이더를 변경할 때마다 재설정됩니다. 이유는 가져온 이미지에서 생성 된 원본 이미지가 각 필터에 의해 입력 이미지로 그려지기 때문입니다. 그러나 이것을 고치는 방법을 모릅니다.여러 코어 이미지 필터를 사용하여 이미지를 적용하는 방법 (결과를 재설정하지 않고)

여러 필터의 결과를 하나의 출력 이미지로 전달하는 가장 좋은 방법을 생각하려고합니다. owolf.net/uploads/StackOverflow/CoreImageFilter.zip

과 viewControler의 코드 중 일부는 아래에 붙여 넣기 :

당신은있는 필터를 적용하는 순서를 선택해야
- (void)viewDidLoad 
{ 
    //Create CIImage 
    UIImage *aUIImage = [imageView image]; 
    CGImageRef aCGImage = aUIImage.CGImage; 
    aCIImage = [CIImage imageWithCGImage:aCGImage]; 

    //Create context 
    context = [CIContext contextWithOptions:nil]; 

    saturationFilter = [CIFilter filterWithName:@"CIColorControls" keysAndValues: @"inputImage", aCIImage, nil]; 
    brightnessFilter = [CIFilter filterWithName:@"CIColorControls" keysAndValues: @"inputImage", aCIImage, nil]; 
    contrastFilter = [CIFilter filterWithName:@"CIColorControls" keysAndValues: @"inputImage", aCIImage, nil]; 
     [super viewDidLoad]; 
} 


- (IBAction)saturationSliderValueChanged:(id)sender { 
    outputImage = [saturationFilter outputImage]; 
    CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]]; 
    newUIImage = [UIImage imageWithCGImage:cgimg]; 
    CGImageRelease(cgimg); 
    [imageView setImage:newUIImage]; 
} 

- (IBAction)brightnessSliderValueChanged:(id)sender { 
    [brightnessFilter setValue:[NSNumber numberWithFloat:brigtnessSlider.value] forKey: @"inputBrightness"]; 
    outputImage = [brightnessFilter outputImage]; 
    CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]]; 
    newUIImage = [UIImage imageWithCGImage:cgimg]; 
    CGImageRelease(cgimg); 
    [imageView setImage:newUIImage]; 
} 

- (IBAction)contrastSliderValueChanged:(id)sender { 
    [contrastFilter setValue:[NSNumber numberWithFloat:contrastSlider.value] forKey: @"inputContrast"]; 
    outputImage = [contrastFilter outputImage]; 
    CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]]; 
    newUIImage = [UIImage imageWithCGImage:cgimg]; 
    CGImageRelease(cgimg); 
    [imageView setImage:newUIImage]; 
} 

답변

10

, 다음 첫 번째의 출력을 사용 여기

프로젝트입니다 필터는 두 번째 입력 이미지로, 등등.

CIImage *adjustedImage = self.originalImage; 

[self.vibranceFilter setValue:adjustedImage forKey:@"inputImage"]; 
adjustedImage = [self.vibranceFilter outputImage]; 

[self.hueFilter setValue:adjustedImage forKey:@"inputImage"]; 
adjustedImage = [self.hueFilter outputImage]; 

[self.vignetteFilter setValue:adjustedImage forKey:@"inputImage"]; 
adjustedImage = [self.vignetteFilter outputImage]; 

CGImageRef cgImage = [self.imageContext createCGImage:adjustedImage fromRect:[adjustedImage extent]]; 

self.imageView.image = [UIImage imageWithCGImage:cgImage]; 

CGImageRelease(cgImage); 

adjustedImage 효과적으로 코어 이미지 필터의 효과를 축적 : 여기 내 프로젝트 중 하나의 예입니다. 이 모든 것은 자체 메서드에서 실행되며 슬라이더 값이 변경 될 때마다 호출됩니다.

2

문제는 모든 입력 이미지를 aCIImage으로 설정한다는 것입니다. 당신이 뭔가를 할 필요가 :

[filter1 setValue:aCIImage forKey:@"inputImage"]; 

filter1Output = [filter1 outputImage]; 
[filter2 setValue:filter1Output forKey:@"inputImage"]; 

+0

감사합니다! 도움이되었습니다. – Mrwolfy