2010-08-31 8 views
12

Es posible en el objetivo C que podamos tomar la captura de pantalla y almacenar esta imagen en UIImage.cómo tomar una captura de pantalla del iPhone programáticamente?

+1

posible duplicado http://stackoverflow.com/questions/2214957/how-do-i-take-a-screen-shot-of-a-uiview –

+1

posible duplicado de [Cómo tomar una captura de pantalla mediante programación ] (http://stackoverflow.com/questions/2200736/how-to-take-a-screenshot-programmatically) –

Respuesta

15

Es necesario crear un contexto de mapa de bits del tamaño de la pantalla y utilizar

[self.view.layer renderInContext:c] 

para copiar su vista en ella. Una vez hecho esto, puede usar

CGBitmapContextCreateImage(c) 

para crear una CGImage desde su contexto.

Elaboración:

CGSize screenSize = [[UIScreen mainScreen] applicationFrame].size; 
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); 
CGContextRef ctx = CGBitmapContextCreate(nil, screenSize.width, screenSize.height, 8, 4*(int)screenSize.width, colorSpaceRef, kCGImageAlphaPremultipliedLast); 
CGContextTranslateCTM(ctx, 0.0, screenSize.height); 
CGContextScaleCTM(ctx, 1.0, -1.0); 

[(CALayer*)self.view.layer renderInContext:ctx]; 

CGImageRef cgImage = CGBitmapContextCreateImage(ctx); 
UIImage *image = [UIImage imageWithCGImage:cgImage]; 
CGImageRelease(cgImage); 
CGContextRelease(ctx); 
[UIImageJPEGRepresentation(image, 1.0) writeToFile:@"screen.jpg" atomically:NO]; 

Tenga en cuenta que si se ejecuta el código en respuesta a un clic sobre un UIButton, la imagen se muestra que la tecla pulsada.

+0

¿Puedes elaborar aquí? Gracias – user12345

+0

Solo quería mencionar que se olvidó de liberar el colorSpaceRef –

+1

Además, ¿qué es 'self'? ¿Qué pasa con las transformaciones de ventanas? ¿Sabes lo que sucederá cuando se muestren los teclados/alertas? – Sulthan

22

El código anterior asume que la vista que se va a capturar vive en la pantalla principal ... es posible que no.

¿Funcionaría esto para capturar siempre el contenido de la ventana principal? (Advertencia: compilado en stackoverflow)


- (UIImage *) captureScreen { 
    UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow]; 
    CGRect rect = [keyWindow bounds]; 
    UIGraphicsBeginImageContext(rect.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    [keyWindow.layer renderInContext:context]; 
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return img; 
} 
+0

Animo gráficos en la vista, pero este código ignora la animación (no se elimina después de completarse) – Tibidabo

+0

¡Gracias! Este fue el método más fácil que he encontrado hasta ahora. – Greg

+0

Muchas gracias. –

2

probar esto ...

- (UIImage*)captureView:(UIView *)view 
{ 
    CGRect rect = [[UIScreen mainScreen] bounds]; 
    UIGraphicsBeginImageContext(rect.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    [view.layer renderInContext:context]; 
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return img; 
} 

- (void)saveScreenshotToPhotosAlbum:(UIView *)view 
{ 
    UIImageWriteToSavedPhotosAlbum([self captureView:self.view], nil, nil,nil); 
} 
0

Usa este código para tomar la captura de pantalla:

-(void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
UIGraphicsBeginImageContext(self.webView.bounds.size); 

    [self.webView.layer renderInContext:UIGraphicsGetCurrentContext()]; 

    UIImage *screenshotImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    UIImageWriteToSavedPhotosAlbum(screenshotImage, nil, nil, nil); 

    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 


    NSString *str1=[NSString stringWithFormat:@"%d",myInt]; 

    NSString *pngFilePath = [NSString stringWithFormat:@"%@/page_%@.png",docDir,str1]; // any name u want for image 
    NSLog(@"%@",pngFilePath); 
    NSData *data1 = [NSData dataWithData:UIImagePNGRepresentation(screenshotImage)]; 
    [data1 writeToFile:pngFilePath atomically:YES]; 
} 
2
UIGraphicsBeginImageContext(self.window.bounds.size); 
[self.window.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
NSData * data = UIImagePNGRepresentation(image); 
[data writeToFile:@"foo.png" atomically:YES]; 

actualización de abril de 2011: para la visualización de la retina, cambiar la primera línea en esto:

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) 
{ 
    UIGraphicsBeginImageContextWithOptions(self.window.bounds.size, NO, [UIScreen mainScreen].scale); 
} 
else 
{ 
    UIGraphicsBeginImageContext(self.window.bounds.size); 
} 
0
- (void)SnapShot { 
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { 
     UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, [UIScreen mainScreen].scale); 
    } else { 
     UIGraphicsBeginImageContext(self.view.bounds.size); 
    } 
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    NSData *data = UIImagePNGRepresentation(image); 
    [data writeToFile:@"snapshot.png" options:NSDataWritingWithoutOverwriting error:Nil]; 
    [data writeToFile:@"snapshot.png" atomically:YES]; 

    UIImageWriteToSavedPhotosAlbum([UIImage imageWithData:data], nil, nil, nil); 
} 
+1

Funciona al 100% en mi programa, ¿por qué votar abajo? –

1

// 100% Trabajo

- (UIImage *)screenshot 
{     
    UIGraphicsBeginImageContextWithOptions(self.main_uiview.bounds.size, NO, 2.0f); 
    [self.main_uiview drawViewHierarchyInRect:_main_uiview.bounds afterScreenUpdates:YES]; 

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 
0

La respuesta de @dhaya funciona para mí, pero no se olvide de actualizar la configuración de "Info.plist" para guardar la imagen en la biblioteca. Este código debe agregarse en el archivo "Info.plist" para guardar la imagen de captura en Photo libraray.

<key>NSPhotoLibraryAddUsageDescription</key> 
<string>NeedLibrary access for save Images on Album</string> 
Cuestiones relacionadas