2012-02-27 25 views
6

Tôi đang cố gắng tìm hiểu cách thay đổi màu/màu của UIImage. Tôi phát hiện ra rằng iOS5 có rất nhiều bộ lọc hình ảnh, nhưng tôi gặp khó khăn khi tìm tài liệu về việc sử dụng thích hợp bộ lọc CIColorMatrix.Làm thế nào để sử dụng CIColorMatrix trong iOS5?

-(void)doCIColorMatrixFilter 
{ 

    //does not work, returns nil image 
    CIImage* inputImage = [CIImage imageWithCGImage:[[UIImage imageNamed:@"button.jpg"]CGImage]]; 

    CIFilter *myFilter; 
    NSDictionary *myFilterAttributes; 
    myFilter = [CIFilter filterWithName:@"CIColorMatrix"]; 
    [myFilter setDefaults]; 

    myFilterAttributes = [myFilter attributes]; 

    [myFilterAttributes setValue:inputImage forKey:@"inputImage"]; 
    //How to set up attributes? 

    CIContext *context = [CIContext contextWithOptions:nil]; 
    CIImage *ciimage = [myFilter outputImage]; 
    CGImageRef cgimg = [context createCGImage:ciimage fromRect:[ciimage extent]]; 
    UIImage *uimage = [UIImage imageWithCGImage:cgimg scale:1.0f orientation:UIImageOrientationUp]; 
    [imageView setImage:uimage]; 
    CGImageRelease(cgimg); 

} 

Mã nào đi vào từ điển cho bộ lọc này?

Trả lời

20

Một tháng sau ...

Đây là một ví dụ về CIColorMatrix thiết lập tất cả các thông số của nó :)

-(void)doCIColorMatrixFilter 
{ 
    // Make the input image recipe 
    CIImage *inputImage = [CIImage imageWithCGImage:[UIImage imageNamed:@"facedetectionpic.jpg"].CGImage]; // 1 

    // Make the filter 
    CIFilter *colorMatrixFilter = [CIFilter filterWithName:@"CIColorMatrix"]; // 2 
    [colorMatrixFilter setDefaults]; // 3 
    [colorMatrixFilter setValue:inputImage forKey:kCIInputImageKey]; // 4 
    [colorMatrixFilter setValue:[CIVector vectorWithX:1 Y:1 Z:1 W:0] forKey:@"inputRVector"]; // 5 
    [colorMatrixFilter setValue:[CIVector vectorWithX:0 Y:1 Z:0 W:0] forKey:@"inputGVector"]; // 6 
    [colorMatrixFilter setValue:[CIVector vectorWithX:0 Y:0 Z:1 W:0] forKey:@"inputBVector"]; // 7 
    [colorMatrixFilter setValue:[CIVector vectorWithX:0 Y:0 Z:0 W:1] forKey:@"inputAVector"]; // 8 

    // Get the output image recipe 
    CIImage *outputImage = [colorMatrixFilter outputImage]; // 9 

    // Create the context and instruct CoreImage to draw the output image recipe into a CGImage 
    CIContext *context = [CIContext contextWithOptions:nil]; 
    CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]]; // 10 

    // Draw the image in screen 
    UIImageView *imageView2 = [[UIImageView alloc] initWithImage:[UIImage imageWithCGImage:cgimg]]; 
    CGRect f = imageView2.frame; 
    f.origin.y = CGRectGetMaxY(imageView.frame); 
    imageView2.frame = f; 

    [self.view addSubview:imageView2]; 
} 

Vì vậy, đây là những gì mẫu thực hiện:

Trong 1 chúng tôi tạo ra ciimage, nếu bạn đang nhận được nil đó sau đó chắc chắn rằng bạn đang đi đúng UIImage/CGImage hoặc đường dẫn.

Trong 2 tạo bộ lọc, bạn biết điều này :)

Trong 3 thiết lập các thông số bộ lọc để giá trị mặc định của nó, CoreImage Lập trình hướng dẫn gợi ý chúng ta nên làm điều này mặc dù (Tôi đã không thử nghiệm bất kỳ/điều lạ xấu nếu tránh.)

Trong 4 thiết lập các đầu vào ciimage

Từ 5 qua 8 chúng ta thiết lập các thông số. Ví dụ: tôi đã tạo vectơ màu đỏ {1,1,1,0} để hình ảnh trông có vẻ là màu đỏ. 6, 78 và không cần thiết ở đây kể từ khi giá trị của chúng cũng giống như giá trị mặc định (nhớ là chúng tôi gọi là -setDefaults?) Nhưng đối với mục đích giáo dục Tôi đoán họ cũng tốt :)

Trong 9 thiết lập hình ảnh đầu ra, mặc dù không phải là rút ra được nêu ra.

Cuối cùng trong 10 bạn nói với CoreImage vẽ hình ảnh đầu ra thành CGImage và chúng tôi đặt CGImage đó thành UIImage và bên trong UIImageView.

Đây là kết quả (tôi đã sử dụng cùng một hình ảnh như this hướng dẫn):

Reddish

Hy vọng nó giúp.

+0

Câu trả lời tuyệt vời. Chỉ là một lưu ý phụ với ghi chú số 1. Đôi khi ciimage là nil vì loại hình ảnh. Vì vậy, đôi khi nó cần thiết để tạo ra cgimage và sau đó là một ciimage từ đó. – Aggressor

+0

@Aggressor Bạn có thể đưa ra một ví dụ về một loại hình ảnh sẽ trả về nil cho ciimage không? Tôi muốn chỉnh sửa câu trả lời giải quyết nó :) – nacho4d

+0

Heres một bài viết giải thích 3. https://medium.com/@ranleung/uiimage-vs-ciimage-vs-cgimage-3db9d8b83d94.Nếu bạn đang làm việc với một loại đã biết (nói một .jpg) và bạn luôn biết rằng bạn sẽ có CIImage thì bạn an toàn. Nhưng nếu ứng dụng của bạn có nhiều loại định dạng tệp thì bạn nên có biện pháp bảo vệ khi CIImage là nil và thay vào đó lấy CGImage và chuyển đổi thành CIImage (điều này có nghĩa là vẽ lại nó trong ngữ cảnh và lấy UIImage-> CIImage từ đó) – Aggressor

5

Chỉ cần một ví dụ Swift với một chuỗi để thêm vào câu trả lời ở trên bởi nacho4d

var output = CIFilter(name: "CIColorControls") 
output.setValue(ciImage, forKey: kCIInputImageKey) 
output.setValue(1.8, forKey: "inputSaturation") 
output.setValue(0.01, forKey: "inputBrightness") 

filter = CIFilter(name: "CIColorMatrix") 
filter.setDefaults() 
filter.setValue(output.outputImage, forKey: kCIInputImageKey) 
filter.setValue(CIVector(x: 1, y: 0.1, z: 0.1, w: 0), forKey: "inputRVector") 
filter.setValue(CIVector(x: 0, y: 1, z: 0, w: 0), forKey: "inputGVector") 
filter.setValue(CIVector(x: 0, y: 0, z: 1, w: 0), forKey: "inputBVector") 

Lưu ý rằng giá trị mặc định là 1,0,0 0,1,0 và 0,0,1 tương ứng với RGB và nếu bạn muốn làm cho nó thêm màu đỏ, bạn sẽ đặt inputRVector thành 1,1,1 và để các giá trị khác giống nhau (vì bội số này là các thành phần màu xanh và màu xanh lá cây theo giá trị màu đỏ)

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