2009-08-10 8 views
7

Ho la sensazione che questo non sia un compito facile, ma ho bisogno di combinare o appiattire un UIImageView con un'altra vista UIImage situata sopra di esso. Ad esempio: ho due UIImageViews. Uno di questi ha una UII immagine di un campo erboso (1200 x 1200 pixel). L'altro è un UIImmagine di un pallone da basket (128 x 128 pixel), ed è posizionato sopra l'immagine del campo erboso in modo tale che la pallacanestro sembra essere sul campo erboso. Voglio essere in grado di SALVARE le UIImageViews sovrapposte come un singolo file immagine al mio album fotografico, il che significa che dovrò combinare le due immagini in qualche modo. Come sarebbe stato realizzato? (Nota: Facendo una schermata (320 x 480 pixel) potrebbe non essere una soluzione accettabile come desidero preservare la dimensione di 1200 x 1600 pixelCome "appiattire" più UIImageViews in UNO?

DOMANDA:.
Come posso appiattire multipli UIImageViews in uno e SAVE l'immagine risultante preservando la dimensione/risoluzione

risposta

3

Questo prende qualsiasi vista e ne fa un oggetto UII. Qualsiasi vista e le sue sottoview saranno "appiattite" in una UIImage che è possibile visualizzare o salvare su disco.

- (UIImage*)imageFromView{ 

    UIImage *image; 

    UIGraphicsBeginImageContext(self.view.bounds.size); 
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 

} 
+0

A proposito, Corey, c'è un modo per fare questo (il tuo codice precedente) preservando la risoluzione dell'immagine della vista che è il livello di base (self.view.layer nel tuo codice)? Ho una foto di dimensioni 1200 x 1600 ma dopo l'elaborazione (utilizzando il codice) l'immagine risultante ha la dimensione in pixel di UIImageView che era il suo contenitore (320 x 427). – RexOnRoids

+0

Non posso dirlo con certezza, ma la tattica usata da tequilatango sembra realizzarlo. Il metodo che utilizzo catturerà solo ciò che è sullo schermo alla risoluzione dello schermo. È veloce e sporco, ma funziona. Se hai bisogno di risultati migliori, dovrai disegnare l'immagine nel buffer come illustrato. Naturalmente, poiché questo è l'iPhone, se esiste un modo per ridurre le dimensioni delle immagini senza influire su UX, è consigliabile considerarlo per motivi di memoria/prestazioni. –

+0

Per mantenere la risoluzione dell'immagine basta usare 'UIGraphicsBeginImageContextWithOptions (self.view.bounds.size, NO, 0.0)' –

5

Perché non basta disegnare UIImages originali in un buffer di sfondo uno sopra l'altro e quindi scrivere un'immagine combinata in un file? Di seguito è riportato un esempio di come è possibile disegnare due immagini allo stesso buffer:

CGImageRef bgimage = [bguiimage CGImage]; 
width = CGImageGetWidth(bgimage); 
height = CGImageGetHeight(bgimage); 

// Create a temporary texture data buffer 
GLUbyte* data = (GLubyte *) malloc(width * height * 4); 
assert(data); 

// Draw image to buffer 
CGContextRef ctx = CGBitmapContextCreate(data, width, height, 8, width * 4, CGImageGetColorSpace(image), kCGImageAlphaPremultipliedLast); 
assert(ctx); 

// Flip image upside-down because OpenGL coordinates differ 
CGContextTranslateCTM(ctx, 0, height); 
CGContextScaleCTM(ctx, 1.0, -1.0); 

CGContextDrawImage(ctx, CGRectMake(0, 0, (CGFloat)width, (CGFloat)height), bgimage); 

CGImageRef ballimage = [balluiimage CGImage]; 
bwidth = CGImageGetWidth(ballimage); 
bheight = CGImageGetHeight(ballimage); 

float x = (width - bwidth)/2.0; 
float y = (height - bheight)/2.0; 
CGContextDrawImage(ctx, CGRectMake(x, y, (CGFloat)bwidth, (CGFloat)bheight), ballimage); 

CGContextRelease(ctx); 
+0

Grazie per questo suggerimento. Conserva la risoluzione/i pixel delle immagini originali o finiscono per avere le stesse dimensioni delle viste che li contengono? – RexOnRoids

+0

Conserva la risoluzione, perché si disegna l'immagine originale. –