如何使用多个核心图像滤镜来处理图像(不重置结果)?

5
我有一个项目,其中包含几个核心图像过滤器,每个过滤器都连接到不同的滑块。一切正常,但我还没有找到将一个过滤器的结果传递给下一个过滤器的最佳方法。每次更改其他任何滑块时,它们都会重置。原因是导入的图像创建的原始图像被每个过滤器作为输入图像绘制。但不确定如何解决这个问题。
我正在尝试想出将多个过滤器的结果传递到一个输出图像的最佳方法。
以下是项目:owolf.net/uploads/StackOverflow/CoreImageFilter.zip 以下是一些viewController的代码:
- (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];
}
2个回答

12

你需要选择一种顺序来应用过滤器,然后将第一个过滤器的输出作为第二个过滤器的输入图像,依此类推。这里是我项目中的一个例子:

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滤镜的效果。所有这些都在它自己的方法中完成,该方法在滑块值发生任何变化时都会被调用。


2

问题在于您将所有输入图像设置为aCIImage。您需要执行以下操作:

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

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

etc.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接