iPhone, ¿cómo se superpone una imagen a otra para crear una nueva imagen para guardar? (filigrana)


Básicamente quiero tomar una imagen que el usuario elija de su biblioteca de fotos y luego aplicar una marca de agua, un triángulo en la parte inferior derecha que tiene el nombre de la aplicación en ella. Tengo la segunda imagen ya hecha con una capa transparente en photoshop.

Probé una función, que no puedo recordar el nombre exacto, pero involucraba CGIImages y máscaras. Esto combina las dos imágenes, pero como una máscara, lo que hizo que la imagen más oscura donde la capa transparente era y las imágenes no se fusionaron per se, solo enmascarado.

¿Cómo conseguiría que la imagen de marca de agua se fusionara con otra imagen, para hacer una imagen UIImage, sin mostrar las imágenes en la pantalla?

Gracias.

Author: SolidSnake4444, 2011-08-11

3 answers

Es bastante fácil:

UIImage *backgroundImage = [UIImage imageNamed:@"image.png"];
UIImage *watermarkImage = [UIImage imageNamed:@"watermark.png"];

UIGraphicsBeginImageContext(backgroundImage.size);
[backgroundImage drawInRect:CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height)];
[watermarkImage drawInRect:CGRectMake(backgroundImage.size.width - watermarkImage.size.width, backgroundImage.size.height - watermarkImage.size.height, watermarkImage.size.width, watermarkImage.size.height)];
UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Si desea que el fondo y la marca de agua sean del mismo tamaño, use este código

...
[backgroundImage drawInRect:CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height)];
[watermarkImage drawInRect:CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height)];
...
 79
Author: omz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-08 20:05:46

La solución proporcionada por omz también trabaja en Swift, así:

let backgroundImage = UIImage(named: "image.png")
let watermarkImage = UIImage(named: "watermark.png")

UIGraphicsBeginImageContextWithOptions(backgroundImage.size, false, 0.0)
backgroundImage.drawInRect(CGRect(0.0, 0.0, backgroundImage.size.width, backgroundImage.size.height))
watermarkImage.drawInRect(CGRect(backgroundImage.size.width - watermarkImage.size.width, backgroundImage.size.height - watermarkImage.size.height, watermarkImage.size.width, watermarkImage.size.height))
let result = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
 8
Author: CodeMonkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-16 10:10:11

Puede usar este método, que es muy dinámico y puede especificar la posición inicial de la segunda imagen y el tamaño total de la imagen.

-(UIImage *) addImageToImage:(UIImage *)img withImage2:(UIImage *)img2 andRect:(CGRect)cropRect withImageWidth:(int) width{

    CGSize size = CGSizeMake(width,40);
    UIGraphicsBeginImageContext(size);

    CGPoint pointImg1 = CGPointMake(0,0);
    [img drawAtPoint:pointImg1];

    CGPoint pointImg2 = cropRect.origin;
    [img2 drawAtPoint: pointImg2];

    UIImage* result = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return result;

}
 1
Author: Parvez Belim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-06 19:58:28