2013-06-17 12 views
16

Przede dodam UILable na UIImageView a następnie po tym jak screenshot UIView, obraz nie wypada uchwycić UIView Rama i również dołączyć URL obrazu.Przechwytywanie UIView i Zapisz jako obraz

enter image description here

1) Original Image Link :-

enter image description here

2) After Capture the image Link :-

Code: -

UIGraphicsBeginImageContext(viewImage.frame.size); 
    [viewImage.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *vwImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    NSData *data=UIImagePNGRepresentation(vwImage); 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    // NSString *imgName = [NSString stringWithFormat:imagename]; 
    NSString *strPath = [documentsDirectory stringByAppendingPathComponent:imagename]; 
    [data writeToFile:strPath atomically:YES]; 
+0

myślę zrzut została podjęta prawidłowo. Problem, który widzę po drugiej stronie. Czy jesteś pewien, że Twoje UIView ma taki sam rozmiar jak obraz źródłowy? Jeśli nie, to czy dodajesz UIImage do swojego widoku bez zmiany jego rozmiaru? Jesteś pewny? :) "Couse, jeśli masz obraz o rozmiarze 200x500, ale narysowałeś go na UIView o wielkości 300x700 pozwalając UIView, aby rozciągnął obraz, aby zajął całą przestrzeń, wtedy będziesz miał zrzut ekranu rozmiaru UIView, a nie obraz źródłowy – makaron

+0

kiedy zapisuję obrazek przechwytywania w bibliotece zdjęć w tym czasie data nie jest wyświetlana prawidłowo – Rushabh

+0

Ah, ok, mam to teraz. Spróbuj sprawdzić moją odpowiedź tutaj: http://stackoverflow.com/questions/16062974/place-an-image-on-top-of-another-image/16064804#16064804 Istnieje w pełni działający kod do Twojego celu – makaron

Odpowiedz

21

Można podjąć screeny z dowolnego UIView lub przechwyć dowolny kod UIView i zapisz go jako obraz z poniższym kodem.

- (UIImage *)captureView { 

    //hide controls if needed 
    CGRect rect = [self.view bounds]; 

    UIGraphicsBeginImageContext(rect.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    [self.view.layer renderInContext:context]; 
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return img; 

} 
+0

po zapisaniu tego obrazu przechwytywania w bibliotece zdjęć w tym czasie data niepoprawnego wyświetlania – Rushabh

+0

spróbuj tej metody? a także zmienić właściwość Autoresize z UILable –

+0

tak, spróbuj :) – Rushabh

0

Spróbuj tak,

UIGraphicsBeginImageContext(viewImage.frame.size); 
CGContextRef ctx = UIGraphicsGetCurrentContext(); 
[[UIColor blackColor] set]; 
CGContextFillRect(ctx, viewImage.frame);  

[viewImage.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *vwImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

NSData *data=UIImagePNGRepresentation(vwImage); 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
// NSString *imgName = [NSString stringWithFormat:imagename]; 
NSString *strPath = [documentsDirectory stringByAppendingPathComponent:imagename]; 
[data writeToFile:strPath atomically:YES]; 
2

można użyć poniższy kod do

UIGraphicsBeginImageContext(pictureView.bounds.size); 
      

[pictureView.layer renderInContext:UIGraphicsGetCurrentContext()]; 

UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil); 
13

podjąć migawki z UIView

zdać widok do tej funkcji zajmie się wszystkim sam (No n Potrzeba, aby ustawić granice lub ramek)

- (UIImage *)takeSnapshotOfView:(UIView *)view 
{ 
    UIGraphicsBeginImageContext(CGSizeMake(view.frame.size.width, view.frame.size.height)); 
    [view drawViewHierarchyInRect:CGRectMake(0, 0, view.frame.size.width, view.frame.size.height) afterScreenUpdates:YES]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 
+0

Rozwiązanie [view.layer renderInContext: ctx] proponowane wszędzie w Internecie rzucało CGGetColorAlpha EXC_BAD_ACCESS, ale działało to jak wdzięk. –

7

Swift 3 Wersja:

func takeSnapshotOfView(view:UIView) -> UIImage? { 
     UIGraphicsBeginImageContext(CGSize(width: view.frame.size.width, height: view.frame.size.height)) 
     view.drawHierarchy(in: CGRect(x: 0.0, y: 0.0, width: view.frame.size.width, height: view.frame.size.height), afterScreenUpdates: true) 
     let image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return image 
    }