2012-08-13 9 views
5

Tengo un proyecto con varios filtros de imagen central, cada uno conectado a un control deslizante diferente. Todo funciona pero no he descubierto la mejor manera de pasar los resultados de un filtro al siguiente. Cada uno se reinicia cada vez que cambio alguno de los otros controles deslizantes. La razón es porque la imagen original, creada a partir de una imagen importada, es dibujada por cada filtro como la imagen de entrada. Pero no estoy seguro de cómo solucionar esto.cómo aplicar una imagen con múltiples filtros de imagen central (sin restablecer el resultado)

Estoy tratando de pensar en la mejor manera de pasar los resultados de filtros múltiples en una imagen de salida.

aquí es el proyecto: owolf.net/uploads/StackOverflow/CoreImageFilter.zip

y algunos de código del viewControler pegado a continuación:

- (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]; 
} 

Respuesta

10

Usted tiene que elegir un orden en el que aplicar los filtros, a continuación, utilizar la salida de la primera filtrar como la imagen de entrada del segundo, y así sucesivamente. He aquí un ejemplo de uno de mis proyectos:

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); 

El valor adjustedImage acumula de manera efectiva los efectos de los filtros Core Image. Todo esto va en su propio método, que se llama cada vez que cambia alguno de los valores de su control deslizante.

2

El problema es que está configurando la imagen de entrada para todos ellos en el aCIImage. Que tiene que hacer algo como esto:

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

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

etc.

+0

Gracias! Eso fue útil. – Mrwolfy

Cuestiones relacionadas