Domanda

Sto cercando di scoprire come cambiare il colore / tonalità di un uiimage.Ho scoperto che IOS5 ha molti filtri immagini, ma ho difficoltà a trovare la documentazione sull'uso corretto del filtro CIColorMatrix.

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

}
.

Quale codice entra nel dizionario per questo filtro?

È stato utile?

Soluzione

Un mese dopo ...

Questo è un esempio di CIColorMatrix impostando tutti i suoi parametri :)

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

Quindi questo è ciò che il campione fa:

In 1 creiamo il ciimage, se stai ottenendo nulla, assicurati di passare il giusto uiimage / cgimage o percorso.

In 2 Crea il filtro, lo sai :)

In 3 Impostare i parametri del filtro alle sue impostazioni predefiniti, suggerisce la guida di programmazione CoreImagrage, dovremmo farlo, anche se (non ho sperimentato cose strane / cattive se evitate)

In 4 Imposta la ciimage di input

Da 5 tramite 8 Abbiamo impostato i parametri. Ad esempio ho fatto il vettore rosso {1,1,1,0} Quindi l'immagine sembra rossastra . 6, 7 e 8 e non è necessario qui Dato che i loro valori sono gli stessi dei valori predefiniti (ricorda che abbiamo chiamato -setDefaults?) Ma per scopi educativi credo che stanno bene :)

In 9 Imposta l'immagine di uscita, anche se non è ancora disegnata.

Infine in 10, si dici a CoreImagrage di disegnare l'immagine di uscita in una cgimage e mettiamo quel cgimage in un uiimage e all'interno di un'interfaccia uiimageview.

Questo è il risultato (ho usato la stessa immagine di Questo Tutorial):

rossastro

Spero che aiuti.

Altri suggerimenti

Solo un rapido esempio con una catena da aggiungere alla risposta sopra di 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")
.

Si noti che i valori predefiniti sono rispettivamente di 1,0,0 0,1,0 e 0,01 per RGB e se si desidera renderlo più rosso si imposta l'inputRVerctor su 1.1,1 e lasciare ilAltri lo stesso (come questo multilifica i componenti blu e verdi per valori rossi)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top