2011-01-19 4 views
13

Ho un UIView e voglio che sia memorizzato come PNG trasparente, cioè senza il colore di sfondo UIView ...Salva UIView a un PNG trasparente

Attualmente sto usando questo codice e che sta funzionando OK, ma con il colore di sfondo :(

UIGraphicsBeginImageContext(self.bounds.size); 
[self.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage* image1 = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
NSData *imageData = UIImagePNGRepresentation(image1); 
[imageData writeToFile:filePath atomically:YES]; 

Così qualcuno ha qualche idea su come ottenere questa immagine come una trasparente?

Grazie in anticipo ..

+1

tenta di impostare lo sfondo della vistaColore a [UIColor clearColor]; –

+2

grazie per la tua risposta, il punto è che voglio che l'utente veda lo sfondo e voglio generare l'immagine e memorizzarla nei documenti mentre l'app è in esecuzione :( –

+0

Hai mai funzionato? – Travis

risposta

7

Cambiare la ba Colore ckground in [UIColor clear], disegna l'immagine e quindi imposta il colore di sfondo sul colore originale.

Poiché gli aggiornamenti della GUI verranno attivati ​​solo nel ciclo di runloop successivo, l'utente non dovrebbe vedere alcun sfarfallio.

UIColor* color=self.backgroundColor; 
view.backgroundColor=[UIColor clearColor]; 

UIGraphicsBeginImageContext(self.bounds.size); 
[self.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage* image1 = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
NSData *imageData = UIImagePNGRepresentation(image1); 
[imageData writeToFile:filePath atomically:YES]; 

self.backgroundColor=color; 
2

In aggiunta alla risposta di Gilad. Sul display retina questo potrebbe causare alcuni problemi di qualità. Per ottenere il contesto retina è possibile utilizzare questo codice dal post this.

UIColor* color=self.backgroundColor; 
view.backgroundColor=[UIColor clearColor]; 

// This is for retina render check 
UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow]; 
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) 
    UIGraphicsBeginImageContextWithOptions(YourView.frame.size, NO, [UIScreen mainScreen].scale); 
else 
    UIGraphicsBeginImageContext(keyWindow.bounds.size); 
// And it goes up to here the rest stays the same 

[self.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage* image1 = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
NSData *imageData = UIImagePNGRepresentation(image1); 
[imageData writeToFile:filePath atomically:YES]; 

self.backgroundColor=color; 
9

Nel mio caso, ho dimenticato la proprietà opaca. Dovrebbe essere impostata su NO:

view.opaque = NO; 
+0

Questo era il link mancante! Ho usato questa risposta (http://stackoverflow.com/a/22494886/251394) per salvare l'immagine. – srik

+0

Questo ha funzionato per me! – bodagetta

0

Per Objective-C è necessario impostare opaco = NO

+ (UIImage *) imageWithView:(UIView *)view 
    {  
     UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, [[UIScreen mainScreen] scale]);  
     [view.layer renderInContext:UIGraphicsGetCurrentContext()];  
     UIImage * img = UIGraphicsGetImageFromCurrentImageContext();  
     UIGraphicsEndImageContext();  
     return img; 
    } 

Per Swift è necessario impostare opaco = false

func imageWithView(inView: UIView) -> UIImage? { 
     UIGraphicsBeginImageContextWithOptions(inView.bounds.size, false, 0.0) 
     if let context = UIGraphicsGetCurrentContext() { 
      inView.layer.render(in: context) 
      let image = UIGraphicsGetImageFromCurrentImageContext() 
      UIGraphicsEndImageContext() 
      return image 
     } 
     return nil 
    }