5

それぞれが異なるスライダーに接続されているいくつかのコア画像フィルターを含むプロジェクトがあります。すべてが機能しますが、あるフィルターから次のフィルターに結果を渡す最良の方法がわかりません。他のスライダーを変更するたびに、それぞれがリセットされます。その理由は、インポートされた画像から作成された元の画像が、入力画像として各フィルターによって描画されるためです。しかし、これを修正する方法がわかりません。

複数のフィルターの結果を 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];
}
4

2 に答える 2

12

フィルターを適用する順序を選択し、最初のフィルターの出力を 2 番目の入力画像として使用する必要があります。以下は、私のプロジェクトの 1 つの例です。

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は、Core Image フィルターの効果を効果的に蓄積します。これはすべて独自のメソッドで行われ、スライダーの値が変更されるたびに呼び出されます。

于 2012-08-13T04:47:25.077 に答える
2

問題は、それらすべての入力画像をaCIImage. 次のようなことをする必要があります:

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

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

于 2012-08-13T04:47:58.227 に答える