2011-08-11 12 views
25

Fondamentalmente voglio prendere un'immagine che l'utente sceglie dalla sua libreria di foto e quindi applicare una filigrana, un triangolo in basso a destra che ha il nome dell'applicazione su di esso. Ho la seconda immagine già realizzata con un livello trasparente in Photoshop.iPhone, come si sovrappone un'immagine a un'altra per creare una nuova immagine da salvare? (filigrana)

Ho provato una funzione, che non riesco a ricordare il nome esatto, ma ha coinvolto CGIImages e maschere. Questo combina le due immagini, ma come una maschera, che ha reso l'immagine più scura dove era lo strato trasparente e le immagini non sono state unite di per sé, ma solo mascherate.

Come si ottiene l'unione dell'immagine filigrana con un'altra immagine, per creare un'immagine UII senza visualizzare le immagini sullo schermo?

Grazie.

+0

possibile duplicato di [Crea un UIImage da altre due UIImages su iPhone] (http: // stackoverflow.com/questions/679245/create-a-uiimage-from-two-other-uiimages-on-the-iphone) –

risposta

76

è abbastanza facile:

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(); 

Se si desidera che lo sfondo e filigrana di essere delle stesse dimensioni quindi utilizzare questo codice

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

Ha funzionato perfettamente! Hai ragione, è stato abbastanza facile. Grazie mille per l'aiuto! – SolidSnake4444

+0

È preferibile utilizzare UIGraphicsBeginImageContextWithOptions anziché UIGraphicsBeginImageContext per preservare la qualità dell'immagine sui display retina. Vedi http://stackoverflow.com/questions/4334233/how-to-capture-uiview-to-uiimage-without-loss-of--ality-on-retina-display per maggiori informazioni. –

+0

Tu signore meriti torta! Questa è una soluzione eccellente. Ho lo stesso bisogno e mi hai risparmiato un sacco di tempo. – Jordan

1

È possibile utilizzare questo metodo, che è molto dinamico e è possibile specificare la posizione iniziale della seconda immagine e la dimensione totale dell'immagine.

-(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 soluzione fornita da OMZ funziona anche in Swift, in questo modo:

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() 
Problemi correlati