2012-08-13 22 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