2011-01-19 13 views
13

Mam UIView i chcę to być przechowywane jako przezroczysty PNG, czyli bez UIView kolor tła ...Zapisz UIView do przezroczystego PNG

Obecnie używam tego kodu i wszystko działa OK, ale z kolor tła :(

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

Więc czy ktoś ma jakiś pomysł co otrzymuję ten obraz jako przezroczysta?

góry dziękuję ..

+1

spróbuj ustawić kolor tła widoku to [UIColor clearColor]; –

+2

dziękuję za odpowiedź, chodzi o to, że chcę, aby użytkownik zobaczył tło i chcę wygenerować obraz i zapisać go w dokumentach, gdy aplikacja jest uruchomiona :( –

+0

Czy kiedykolwiek dostałeś to do pracy? zrobić coś podobnego – Travis

Odpowiedz

7

Zmiana ba ckground kolor [UIColor clear], narysuj obraz, a następnie ustaw kolor tła z powrotem na kolor oryginalny.

Ponieważ aktualizacje GUI będą uruchamiane tylko w następnym cyklu biegu, użytkownik nie powinien widzieć żadnego migotania.

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

Jako uzupełnienie odpowiedzi Gilada. Na wyświetlaczu Retina może to powodować problemy z jakością. Aby uzyskać kontekst siatkówki, możesz użyć tego kodu z postu 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

W moim przypadku zapomniałem o nieprzezroczystej nieruchomości. Powinien być ustawiony na NO:

view.opaque = NO; 
+0

To był brakujący link! Użyłem tej odpowiedzi (http://stackoverflow.com/a/22494886/251394), aby zapisać obraz. – srik

+0

To zadziałało dla mnie! – bodagetta

0

Dla objective-c trzeba ustawić nieprzezroczysty = Nie

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

Dla Swift trzeba ustawić nieprzezroczysty = 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 
    } 
Powiązane problemy