2013-06-17 18 views
16

Prima di aggiungo il UILable su UIImageView e poi dopo ho screenshot The UIView, l'immagine non corretta acquisizione del UIView Telaio ho anche allegare l'URL dell'immagine.Capture UIView e Salva come immagine

enter image description here

1) Original Image Link :-

enter image description here

2) After Capture the image Link :-

Codice: -

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

Penso che la schermata è stata presa in modo corretto. Il problema che vedo dall'altra parte. Sei sicuro che il tuo UIView abbia le stesse dimensioni dell'immagine sorgente? Se no, allora aggiungi UIImage alla tua vista senza modificarne le dimensioni? Sei sicuro? :) 'Couse se si dispone di un'immagine di dimensioni 200x500, ma avete disegnato su UIView di dimensione 300x700 permettendo UIView di allungare l'immagine per poter occupare tutto lo spazio, allora avrai uno screenshot della dimensione UIView, non il immagine sorgente – makaron

+0

quando salvo che l'immagine di cattura in libreria fotografica in quel momento la data non corretta visualizzazione – Rushabh

+0

Ah, ok, ha ora. Provate a controllare la mia risposta qui: http://stackoverflow.com/questions/16062974/place-an-image-on-top-of-another-image/16064804#16064804 C'è un codice completamente funzionante per il vostro scopo – makaron

risposta

21

si può prendere la screenshot di qualsiasi UIView o catturare qualsiasi UIView e salvarlo come un'immagine con il codice sottostante.

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

quando salvo che l'immagine di acquisizione nella libreria di foto in quel momento la data in display non corretto – Rushabh

+0

provi questo metodo ?? e anche modificare la proprietà Ridimensiona automaticamente di UILable –

+0

sì ho provato :) – Rushabh

0

Prova in questo modo,

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

è possibile utilizzare il codice sottostante per

UIGraphicsBeginImageContext(pictureView.bounds.size); 
      

[pictureView.layer renderInContext:UIGraphicsGetCurrentContext()]; 

UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

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

Prendere un'istantanea di un UIView

passare l'immagine per questa funzione gestirà tutto da solo (n eed per impostare limiti o cornici)

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

[view.layer renderInContext: ctx] la soluzione proposta ovunque su internet è stata lanciare CGGetColorAlpha EXC_BAD_ACCESS, ma ha funzionato come un incantesimo. Grazie! –

7

Swift 3 Versione:

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 
    }