2011-11-29 10 views
11

Estoy trabajando con una imagen donde el usuario ha seleccionado parte de ella usando UIBezierPath. ¿Cómo puedo eliminar/borrar/hacer transparente todo lo que no es parte de esa selección?iOS UIImage clip to paths

Respuesta

20

Con una ruta es muy fácil. Sólo hay que establecer la ruta como el trazado de recorte:

- (UIImage *)maskImage:(UIImage *)originalImage toPath:(UIBezierPath *)path { 
    UIGraphicsBeginImageContextWithOptions(originalImage.size, NO, 0); 
    [path addClip]; 
    [originalImage drawAtPoint:CGPointZero]; 
    UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return maskedImage; 
} 

Si desea utilizar la unión de varias rutas, es más difícil, porque cuarzo no tiene ningún funciones que calculan directamente la unión de dos caminos. Una forma es llenar cada ruta de uno a uno en una máscara, y luego dibujar la imagen a través de la máscara:

- (UIImage *)maskedImage 
{ 
    CGRect rect = CGRectZero; 
    rect.size = self.originalImage.size; 
    UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0.0); { 
     [[UIColor blackColor] setFill]; 
     UIRectFill(rect); 
     [[UIColor whiteColor] setFill]; 
     for (UIBezierPath *path in self.paths) 
      [path fill]; 
    } 
    UIImage *mask = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0); { 
     CGContextClipToMask(UIGraphicsGetCurrentContext(), rect, mask.CGImage); 
     [self.originalImage drawAtPoint:CGPointZero]; 
    } 
    UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return maskedImage; 
} 
+0

Wow. No tenía idea de que fuera tan fácil. Estaba buscando en todos los lugares equivocados. El recorte restringe el área de dibujo, ¿verdad? –

+0

Huh, tengo múltiples nsbezierpaths, o si tengo un nsbezierpath donde los trazos están uno encima del otro, esto se atornilla. –

+0

Lo siento, esto en realidad no funciona. Tengo varios UIBezierPath que no necesariamente representan las formas que quiere el clip, sino selecciones. Recortar en múltiples UIBezierPaths que a veces son uno sobre el otro no devuelve la imagen adecuada. –

0

He probado el código de unión múltiples caminos, y no funciona.

En realidad, si la unión de rutas no se superpone entre sí, agregamos una ruta a otra y recortamos con la ruta final.

UIGraphicsBeginImageContextWithOptions(originalImg.size, NO, 0); 
[path1 appendPath:path2]; // append path2 to path1 
[path1 addClip]; 

[originalImg drawAtPoint:CGPointZero]; 
result = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext();