2012-02-27 15 views
6

Próbuję dowiedzieć się, jak zmienić kolor/odcień UIImage. Dowiedziałem się, że iOS5 ma wiele filtrów obrazu, ale mam problem ze znalezieniem dokumentacji na temat prawidłowego użycia filtra CIColorMatrix.Jak korzystać z CIColorMatrix w systemie 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); 

} 

Jaki kod trafia do słownika dla tego filtra?

Odpowiedz

20

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

Reddish

Nadzieję, że to pomaga.

+0

Ś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

+0

@Aggressor Czy możesz podać przykładowy typ obrazu, który zwróci zero dla ciimage? Chciałbym edytować odpowiedź na to pytanie :) – nacho4d

+0

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

5

Tylko Swift przykład z łańcucha, aby dodać do powyższej odpowiedzi przez 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") 

Należy pamiętać, że domyślnie są 1,0,0 0,1,0 i 0,0,1 odpowiednio dla RGB i jeśli chcesz, aby był bardziej czerwony, ustaw parametr inputRVector na 1,1,1, a pozostałe pozostaną takie same (ponieważ spowoduje to wielokrotne zaznaczenie niebieskich i zielonych komponentów czerwonymi wartościami).

Powiązane problemy