2012-08-13 26 views
5

Tôi có một dự án với một số bộ lọc ảnh lõi, mỗi bộ lọc được kết nối với một thanh trượt khác. Tất cả mọi thứ hoạt động nhưng tôi chỉ không tìm ra cách tốt nhất để chuyển kết quả từ một bộ lọc sang bộ lọc tiếp theo. Mỗi thiết lập lại mỗi lần tôi thay đổi bất kỳ thanh trượt nào khác. Lý do là vì hình ảnh gốc, được tạo ra từ một hình ảnh được nhập sẽ được vẽ bởi từng bộ lọc làm hình ảnh đầu vào. Nhưng không chắc chắn làm thế nào để sửa lỗi này.cách tạo ảnh với nhiều bộ lọc ảnh lõi (không cần đặt lại kết quả)

Tôi đang cố gắng nghĩ cách tốt nhất để chuyển kết quả của nhiều bộ lọc vào một hình ảnh đầu ra.

đây là dự án: owolf.net/uploads/StackOverflow/CoreImageFilter.zip

và một số mã của viewControler dán dưới đây:

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

Trả lời

10

Bạn cần phải chọn một trật tự trong đó để áp dụng các bộ lọc, sau đó sử dụng đầu ra của đầu tiên lọc như hình ảnh đầu vào của thứ hai, v.v. Dưới đây là ví dụ từ một trong các dự án của tôi:

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

Giá trị adjustedImage tích lũy hiệu quả các bộ lọc Hình ảnh lõi. Điều này tất cả đi theo phương pháp riêng của nó, được gọi là bất cứ khi nào bất kỳ giá trị thanh trượt của bạn thay đổi.

2

Vấn đề là bạn đang đặt hình ảnh đầu vào cho tất cả chúng thành aCIImage. Bạn cần phải làm một cái gì đó như thế này:

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

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

, vv

+0

Cảm ơn! Điều đó rất hữu ích. – Mrwolfy

Các vấn đề liên quan