2012-03-07 38 views
13

Tengo problemas para recortar la imagen. Para mí, el filtro CICrop no funciona correctamente. Si mi CIVector xey (orígenes) son 0 todo bien (la imagen está recortada desde la esquina inferior izquierda), la imagen está recortada por el ancho y alto de mi rectángulo, pero si los orígenes de CIVector (xey) no son 0 en mi recortada la imagen se convierte en espacio (porque CICrop filtra el recorte desde la esquina inferior izquierda sin importar los orígenes (xey)).Recortar CIImage con CICrop no funciona correctamente

estoy cultivo CIImage con rectángulo, fuente:

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"]; 

de imagen de salida con CIVector X 150 e Y 150: (I atraído la frontera para mayor claridad)

enter image description here

Imagen de salida con CIVector X 0 e Y 0:

enter image description here

imagen original:

enter image description here

Lo que estoy haciendo mal? ¿O se supone que debe hacer esto?

Respuesta

25

¿Estás seguro de que la imagen de salida es del tamaño que estás esperando? ¿Cómo dibuja la imagen de salida? El filtro CICrop no reduce el tamaño de la imagen original, simplemente borra el contenido que no desea.

Para obtener el resultado que desea es probable que tenga que acaba de hacer esto:

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

Si desea una real CIImage como salida en lugar de sólo dibujo, simplemente hacer esto:

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

Gracias Rob! Es bueno para dibujar una imagen, pero cómo hacerlo si necesito un CIImage recortado, no para dibujar, sino un CIImage. Convierte a NSImapa de bloqueo de imágenes -> dibujar imagen -> desbloquearfocus -> convertir a CIImager. Hmm, creo que esto no es bueno, ¿quizás me puedes sugerir cómo obtener CIImage completamente cortado? Muchas gracias de nuevo por su ayuda Rob. +1 –

+0

Agregué un ejemplo del método 'imageByCroppingToRect:' a mi respuesta, que logrará lo que desea. –

+0

Hmm ... esto no funciona para mí, el mismo problema. Mira mi pregunta, agregué el código de actualización en la parte inferior. Gracias por la paciencia Rob. –

7

Es importante tener en cuenta que el sistema de coordenadas de una vista se encuentra en la esquina superior izquierda, mientras que CIImage está en la parte inferior izquierda. ¡Esto te volverá loco si no lo atrapas cuando haces estas transformaciones! Esta otra publicación describe una conversión unidireccional: Changing CGrect value to user coordinate system.

+0

Me estaba haciendo dudar de mi cordura ... ¡Gracias! – Munib

Cuestiones relacionadas