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 non:
In 1
creiamo il ciimage, se stai ottenendo nil lì, assicurati di passare il giusto UIImage/CGImage o path.
Nel 2
creare il filtro, sai che questo :)
In 3
impostare i parametri del filtro ai suoi valori predefiniti, guida CoreImage programmazione suggerisce che dovremmo fare questo anche se (non ho sperimentato alcun strane cose/male se evitato.)
In 4
impostare l'ingresso ciimage
Da 5
attraverso 8
abbiamo impostato i parametri. Ad esempio ho realizzato il vettore rosso {1,1,1,0} in modo che l'immagine sia rossiccia. 6
, 7
e 8
e non sarebbe necessaria perché i loro valori sono gli stessi valori predefiniti (ricordate abbiamo chiamato -setDefaults
?), Ma per scopi didattici credo che stanno bene :)
Nel 9
impostare l'immagine di output, anche se non è disegnato ancora.
Infine in 10
si dice a CoreImage di disegnare l'immagine di output in un CGImage, e abbiamo messo quel CGImage in un UIImage e in un UIImageView.
questo è il risultato (io ho usato la stessa immagine this tutorial):
Speranza che aiuta.
Ottima risposta. Solo una nota a margine con la nota n. A volte il ciimage è nullo a causa del tipo di immagine. Quindi a volte è necessario creare cgimage e quindi una immagine da ciò. – Aggressor
@Aggressor Puoi fornire un esempio di un tipo di immagine che restituirà zero per ciimage? Vorrei modificare la risposta indirizzandola :) – nacho4d
Ecco un articolo che spiega il 3. https://medium.com/@ranleung/uiimage-vs-ciimage-vs-cgimage-3db9d8b83d94.Se stai lavorando con un tipo noto (ad esempio un .jpg) e sai sempre che avrai il CIImage allora sei al sicuro. Ma se la tua app prende più tipi di formati di file allora dovresti avere delle protezioni per quando CIImage è nullo e invece prendi il CGImage e convertilo in CIImage (che può significare ridisegnarlo nel contesto e afferrare l'UIImage-> CIImage da quel) – Aggressor