Me gustaría recortar una imagen en iOS basada en una máscara de forma irregular. ¿Cómo puedo hacer esto?¿Cómo recorto una imagen basada en una forma irregular?
8
A
Respuesta
3
No estoy seguro de que desee recortar, pero en su lugar desea enmascarar la imagen. Esto es bastante fácil de hacer, pero eventualmente descubrirá que funciona para algunas imágenes y otras no. Esto se debe a que necesita tener el canal alfa adecuado en la imagen.
Aquí el código que uso, que obtuve de stackoverflow. (Problem with transparency when converting UIView to UIImage)
CGImageRef CopyImageAndAddAlphaChannel(CGImageRef sourceImage) {
CGImageRef retVal = NULL;
size_t width = CGImageGetWidth(sourceImage);
size_t height = CGImageGetHeight(sourceImage);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef offscreenContext = CGBitmapContextCreate(NULL, width, height,
8, 0, colorSpace, kCGImageAlphaPremultipliedFirst);
if (offscreenContext != NULL) {
CGContextDrawImage(offscreenContext, CGRectMake(0, 0, width, height), sourceImage);
retVal = CGBitmapContextCreateImage(offscreenContext);
CGContextRelease(offscreenContext);
}
CGColorSpaceRelease(colorSpace);
return retVal;
}
- (UIImage*)maskImage:(UIImage *)image withMask:(UIImage *)maskImage {
CGImageRef maskRef = maskImage.CGImage;
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
CGImageGetHeight(maskRef),
CGImageGetBitsPerComponent(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBytesPerRow(maskRef),
CGImageGetDataProvider(maskRef), NULL, false);
CGImageRef sourceImage = [image CGImage];
CGImageRef imageWithAlpha = sourceImage;
//add alpha channel for images that don't have one (ie GIF, JPEG, etc...)
//this however has a computational cost
// needed to comment out this check. Some images were reporting that they
// had an alpha channel when they didn't! So we always create the channel.
// It isn't expected that the wheelin application will be doing this a lot so
// the computational cost isn't onerous.
//if (CGImageGetAlphaInfo(sourceImage) == kCGImageAlphaNone) {
imageWithAlpha = CopyImageAndAddAlphaChannel(sourceImage);
//}
CGImageRef masked = CGImageCreateWithMask(imageWithAlpha, mask);
CGImageRelease(mask);
//release imageWithAlpha if it was created by CopyImageAndAddAlphaChannel
if (sourceImage != imageWithAlpha) {
CGImageRelease(imageWithAlpha);
}
UIImage* retImage = [UIImage imageWithCGImage:masked];
CGImageRelease(masked);
return retImage;
}
Y que lo llaman así:
customImage = [customImage maskImage:customImage withMask:[UIImage imageNamed:@"CircularMask.png"]];
En este caso, estoy usando una máscara circular para hacer una imagen circular. Tendrá que hacer la máscara irregular que se adapte a sus necesidades.
Cuestiones relacionadas
- 1. ¿Cómo recorto una imagen en Java?
- 2. MATLAB: cómo recorto un círculo de una imagen
- 3. Área de forma irregular
- 4. iphone UIbezierpath imagen irregular recorte
- 5. Representando un mundo de juego que tiene una forma irregular
- 6. Buscando una manera de simular DIV de forma irregular
- 7. ¿Cómo se dibuja una imagen basada en un polígono simple?
- 8. Interpolación sobre una cuadrícula irregular
- 9. Forma de Windows de forma irregular (C#)
- 10. Convierta una serie temporal irregular en una serie temporal normal
- 11. ¿Cómo recortaría programáticamente una imagen a una forma no rectangular?
- 12. ¿Cómo usar una forma dibujable junto con una imagen?
- 13. Crear una ventana en qt con forma de una imagen
- 14. ¿Cómo crear una aplicación basada en tema?
- 15. Delphi: ¿cómo recorto un mapa de bits "en su lugar"?
- 16. Algoritmo para encontrar una forma cuadrada en una imagen?
- 17. Forma rápida de decodificar una imagen JPEG
- 18. División de cadena basada en una expresión regular
- 19. Mostrar una nueva porción de una imagen basada en el desplazamiento
- 20. ¿Una PowerShell basada en python?
- 21. descargar de forma sincrónica una imagen desde una URL
- 22. Cómo ordenar una colección basada en una propiedad de subcolección
- 23. ¿Cómo escribo una transformación de proto basada en una función?
- 24. La mejor forma de recortar espacios en una cadena
- 25. Cómo dibujar una imagen en una ventana?
- 26. cómo dibujar una línea en una imagen?
- 27. Dependencia Inyección basada en una condición
- 28. Generar una cadena aleatoria basada en una expresión regular
- 29. OpenCV Centroide of Irregular Shape
- 30. ¿Cómo crear un botón de imagen de forma irregular donde no se puede hacer clic en la parte transparente de la imagen?
gracias por su reproducción, pero mi problema es otro. Tengo 4 puntos diferentes, como un trapezoide. El usuario también puede cambiar estos puntos y hacer que la forma sea de su estilo. Ahora quiero recortar la imagen de la misma forma que el usuario ha creado draging point –
¿Puedes tomar los 4 puntos, renderizarlos en una máscara y luego utilizar el código anterior? –
lo siento, soy nuevo en el desarrollo de IOS. No puedo entender su punto. Por ejemplo, tengo cuatro puntos CGPoint firstPoint, secondPoint, thirdPoint y fourthPoint de trapezoid, entonces cómo uso el código anterior Gracias –