2012-08-13 4 views
5

複数のコアイメージフィルタを持つプロジェクトがあり、それぞれが異なるスライダに接続されています。すべてが機能しますが、1つのフィルタから次のフィルタに結果を渡す最善の方法を見つけられませんでした。他のスライダーを変更するたびにリセットされます。その理由は、インポートされた画像から作成された元の画像が各フィルタによって入力画像として描画されるためです。しかし、これをどのように修正するか分からない。複数のコアイメージフィルタを使用して画像を表示する方法(結果をリセットせずに)

複数のフィルタの結果を1つの出力イメージに渡す最善の方法を考えようとしています。 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

あなたが最初の出力を使用し、その後、フィルタを適用する順序を選択する必要があり、ここで

はプロジェクトです第2の入力画像としてフィルタリングし、以下同様である。ここに私のプロジェクトの一つの例です:

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

関連する問題