2012-03-07 14 views
13

Ho problemi a ritagliare l'immagine. Per me il filtro CICrop non funziona correttamente. Se il mio CIVector xey (le origini) sono 0 tutto funziona correttamente (l'immagine è ritagliata dall'angolo in basso a sinistra), l'immagine viene ritagliata dalla larghezza e dall'altezza del mio rettangolo, ma se le origini di CIVector (xey) non sono 0 nel mio ritaglio l'immagine diventa spazio (perché il filtro CICrop ritaglia dall'angolo in basso a sinistra indipendentemente dalle origini (xey)).Il ritaglio di CIImage con CICrop non funziona correttamente

sto ritaglio CIImage con bottone, fonte:

CIVector *cropRect =[CIVector vectorWithX:150 Y:150 Z: 300 W: 300]; 

CIFilter *cropFilter = [CIFilter filterWithName:@"CICrop"]; 

[cropFilter setValue:myCIImage forKey:@"inputImage"]; 
[cropFilter setValue:cropRect forKey:@"inputRectangle"]; 

CIImage *croppedImage = [cropFilter valueForKey:@"outputImage"]; 

immagine di uscita con CIVector X e Y 150 150: (I disegnato il confine per chiarezza)

enter image description here

Immagine di uscita con CIVector X 0 e Y 0:

enter image description here

Immagine originale:

enter image description here

Quello che sto facendo di sbagliato? O dovrebbe fare questo?

risposta

25

Sei sicuro che l'immagine di uscita è la dimensione che ti aspetti? Come stai disegnando l'immagine di output?

Il filtro CICrop non riduce la dimensione dell'immagine originale, ma elimina solo il contenuto che non si desidera.

Per ottenere il risultato che si desidera probabilmente bisogno di fare proprio questo:

[image drawAtPoint:NSZeroPoint fromRect:NSMakeRect(150, 150, 300, 300) operation:NSCompositeSourceOver fraction:1.0]; 

Se si vuole un vero e proprio CIImage come uscita piuttosto che disegnare, basta fare questo:

CIImage* croppedImage = [image imageByCroppingToRect:CGRectMake(150, 150, 300, 300)]; 

//you also need to translate the origin 
CIFilter* transform = [CIFilter filterWithName:@"CIAffineTransform"]; 
NSAffineTransform* affineTransform = [NSAffineTransform transform]; 
[affineTransform translateXBy:-150.0 yBy:-150.0]; 
[transform setValue:affineTransform forKey:@"inputTransform"]; 
[transform setValue:croppedImage forKey:@"inputImage"]; 
CIImage* transformedImage = [transform valueForKey:@"outputImage"]; 
+0

Grazie Rob! È buono per disegnare un'immagine, ma come farlo se ho bisogno di CIImage ritagliato, non per disegnare, ma CIImage. Converti in NSImage lockfocus -> disegna immagine -> unlockfocus -> converti in CIImage. Hmm, penso che questo non sia buono, forse Puoi suggerirmi come ottenere CIImage completamente ritagliato? Grazie ancora per il tuo aiuto Rob. +1 –

+0

Ho aggiunto un esempio del metodo 'imageByCroppingToRect:' alla mia risposta, che otterrà ciò che desideri. –

+0

Hmm .. questo non funziona per me, lo stesso problema. Guarda la mia domanda ho aggiunto il codice di aggiornamento in fondo. Grazie per la pazienza, Rob. –

7

È importante notare che il sistema di coordinate di una vista è in alto a sinistra, mentre CIImage è in basso a sinistra. Questo ti farà impazzire se non lo prendi quando fai queste trasformazioni! Questo altro post descrive una conversione unidirezionale: Changing CGrect value to user coordinate system.

+0

Mi stava facendo dubitare della mia sanità mentale ... Grazie! – Munib

Problemi correlati