2012-08-13 31 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 2012-08-13 05:16:01

相关问题