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
11
A
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
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();
Cuestiones relacionadas
- 1. NSData to UIImage
- 2. Color iOS a transparente en UIImage
- 3. everytime push to heroku, las imágenes no se muestran, clip
- 4. iOS: enmascare un UIImage usando UIBezierPath
- 5. IOS: establecer alfa en un UIImage
- 6. Dynamic Paths in Helper
- 7. Encontrar kth-shortest paths?
- 8. XCode include paths
- 9. MSVC-10 Include Paths
- 10. msys git y long paths
- 11. Dump include paths from g ++
- 12. UIImage: imageWithContentsOfFile es 10 veces más lento en iOS 5.0
- 13. Crear un UIImage con una URL en IOS
- 14. Cómo guardar un UIImage en formato JPEG progresivo en iOS?
- 15. ¿Cómo desaturo un UIImage?
- 16. Guardar UIImage, cargarlo en una orientación incorrecta
- 17. Componer UIActivityTypeMessage con UIImage
- 18. Mercurial "hg status" y paths relativos
- 19. Creando un UIImage de otro UIImage usando imageWithData devuelve nil
- 20. Agregar UIImage encima de otro UIImage
- 21. Clip image image url
- 22. Forma anidada con clip
- 23. CSS3 clip de fondo
- 24. UIImage esquinas redondeadas
- 25. iOS: ¿cree una versión más oscura de UIImage y deje los píxeles transparentes sin cambios?
- 26. Comparando UIImage
- 27. ¿Rotar UIImage?
- 28. Cómo deshabilitar iOS "Shake to Undo" en una aplicación web
- 29. Cargando UIImage desde UIImagePickerControllerReferenceURL
- 30. Cómo estirar un UIImage conservando las esquinas
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? –
Huh, tengo múltiples nsbezierpaths, o si tengo un nsbezierpath donde los trazos están uno encima del otro, esto se atornilla. –
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. –