Jeden miesiąc później ...
Jest przykładem CIColorMatrix
ustawieniu wszystkich jego parametry :)
-(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];
}
więc to, co próbka:
W 1
Kreujemy ciimage, jeśli robisz tam zero, upewnij się, że podajesz właściwą UIImage/CGImage lub ścieżkę.
W 2
utworzyć filtr, to wiesz :)
W 3
ustawić parametry filtru do wartości domyślnych, przewodnik CoreImage Programowanie sugeruje, powinniśmy to zrobić, choć (nie eksperymentowali jakieś dziwne/Bad rzeczy, jeśli unikać.)
W 4
ustaw wejście ciimage
Od 5
przez 8
możemy ustawić parametry. Na przykład zrobiłem czerwony wektor {1,1,1,0}, więc obraz wygląda czerwonawy. 6
, 7
i 8
i nie ma potrzeby tutaj ponieważ ich wartości są takie same jak ustawienia domyślne (pamiętaj nazwaliśmy -setDefaults
?), Ale w celach edukacyjnych i myślę, że są w porządku :)
W 9
ustawić obraz wyjściowy, choć nie jest narysowany jeszcze.
Na koniec w 10
mówisz CoreImage, aby narysował obraz wyjściowy na obrazie CG, a my umieściliśmy go w kodzie UII i wewnątrz obiektu UIImageView.
Jest to wynik (użyłem tego samego obrazu jako this tutoriala):
Nadzieję, że to pomaga.
Świetna, świetna odpowiedź. Nuty boczne z notatką nr 1. Czasami ciimage jest zerowe ze względu na rodzaj obrazu. Tak więc czasami jest to konieczne, aby stworzyć cgimage, a następnie ciimage z tego. – Aggressor
@Aggressor Czy możesz podać przykładowy typ obrazu, który zwróci zero dla ciimage? Chciałbym edytować odpowiedź na to pytanie :) – nacho4d
Oto artykuł wyjaśniający 3. https://medium.com/@ranleung/uiimage-vs-ciimage-vs-cgimage-3db9d8b83d94.Jeśli pracujesz ze znanym typem (powiedzmy .jpg) i zawsze wiesz, że masz CIImage, to jesteś bezpieczny. Ale jeśli twoja aplikacja przyjmuje wiele typów formatów plików, powinieneś mieć zabezpieczenia, gdy CIImage jest zerowe, a zamiast tego chwytać CGImage i konwertować je na CIImage (co może oznaczać ponowne rysowanie w kontekście i pobieranie z tego obiektu kodu UII-> CII.) – Aggressor