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
, 7
và 8
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):
Hy vọng nó giúp.
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
@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
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