2011-08-11 11 views
25

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 él. Tengo la segunda imagen ya hecha con una capa transparente en photoshop.iPhone, ¿cómo se superpone una imagen a otra para crear una nueva imagen para guardar? (marca de agua)

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 máscara, lo que hacía que la imagen fuera más oscura donde estaba la capa transparente y las imágenes no se fusionaron per se, simplemente se enmascaró.

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

Gracias.

+0

posible duplicado de [Crear un UIImage de otros dos UIImages en el iPhone] (http: // stackoverflow.com/questions/679245/create-a-uiimage-from-two-other-uiimages-on-the-iphone) –

Respuesta

76

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 a ser del mismo tamaño a continuación, utilizar el código

... 
[backgroundImage drawInRect:CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height)]; 
[watermarkImage drawInRect:CGRectMake(0, 0, backgroundImage.size.width, backgroundImage.size.height)]; 
... 
+2

¡Funcionó a la perfección! Tienes razón, eso fue bastante fácil. ¡Muchas gracias por la ayuda! – SolidSnake4444

+0

Es mejor usar UIGraphicsBeginImageContextWithOptions en lugar de UIGraphicsBeginImageContext para conservar la calidad de imagen en las pantallas retina. Consulte http://stackoverflow.com/questions/4334233/how-to-capture-uiview-to-uiimage-without-loss-of-quality-on-retina-display para obtener más información. –

+0

¡Usted señor merece torta! Esta es una excelente solución. Tengo la misma necesidad y me has ahorrado mucho tiempo. – Jordan

1

Puede utilizar este método, que es muy dinámico y puede especificar la posición de inicio 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; 

} 
7

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() 
Cuestiones relacionadas