2011-10-27 10 views
7

Quiero capturar una porción particular de la pantalla del iPhone. Usé UIGraphicsBeginImageContextWithOptions, pero no pude capturar una parte de la pantalla con esto. Por favor, ayúdenme.ios cómo capturar una porción particular de la pantalla

+0

¿desea capturar una captura de pantalla de su máquina o desea capturar un área en su aplicación a través del código? – mAc

+2

@mAc obviamente quiere hacerlo con código ... si no es por eso que usa UIGraphicsBeginImageContextWithOptions – Krishnabhadra

Respuesta

15

Puede tomar una captura de pantalla usando UIGraphicsGetImageFromCurrentContext. Escribió debajo el código de la memoria, por lo que los errores posibles. Por favor corrígelo tú mismo.

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

puede utilizar este código

UIGraphicsBeginImageContext(self.view.bounds.size); 

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

UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

CGRect rect = CGRectMake(250,61 ,410, 255); 
CGImageRef imageRef = CGImageCreateWithImageInRect([viewImage CGImage], rect); 

UIImage *img = [UIImage imageWithCGImage:imageRef]; 

UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil); 

CGImageRelease(imageRef); 
+3

, esto es útil cuando tiene que capturar un área específica de su pantalla. – priyanka

+2

amigo impresionante :) –

+0

Tengo la parte en particular por esto. Pero en algunas vistas, está ocultando su contenido. ¿Puedes darme una idea de por qué está sucediendo? – Niharika

0

Otro método para capturar pantalla clara;

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) 
      UIGraphicsBeginImageContextWithOptions(self.captureView.frame.size, NO, [UIScreen mainScreen].scale); 
     else 
      UIGraphicsBeginImageContext(self.captureView.frame.size); 

     [self.captureView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
     UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
     [viewImage drawInRect:CGRectMake(0.0, 0.0, 640,960)]; 
     //NSData*m_Imgdata=UIImagePNGRepresentation(viewImage); 
     NSData*m_Imgdata=UIImageJPEGRepresentation(viewImage, 1.0); 

     // UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil); 

     UIGraphicsEndImageContext(); 
1

la respuesta por @Superdev está justo en punto, lo que quiero añadir es un pequeño truco si desea capturar una vista padre y evitar subvistas (en particular la vista de superposición) lo que puede hacer es hacer que este subvista una propiedad y el uso de la siguiente

CGFloat width = CGRectGetWidth(self.view.bounds); 
CGFloat height = CGRectGetHeight(self.view.bounds); 
_overlayView.hidden = YES; 
UIGraphicsBeginImageContext(self.view.bounds.size); 

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

UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

CGRect rect = CGRectMake(0,0 ,width, height); 
CGImageRef imageRef = CGImageCreateWithImageInRect([viewImage CGImage], rect); 

UIImage *img = [UIImage imageWithCGImage:imageRef]; 

UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil); 

CGImageRelease(imageRef); 

_overlayView.hidden = NO; 

es un pequeño truco, espero que alguien le resultará útil

3

Aquí está una extensión rápida de UIView que, o bien capturar toda la vista o un marco dentro de la vista. Tiene en cuenta la escala de pantalla.

extension UIView { 

    func imageSnapshot() -> UIImage { 
     return self.imageSnapshotCroppedToFrame(nil) 
    } 

    func imageSnapshotCroppedToFrame(frame: CGRect?) -> UIImage { 
     let scaleFactor = UIScreen.mainScreen().scale 
     UIGraphicsBeginImageContextWithOptions(bounds.size, false, scaleFactor) 
     self.drawViewHierarchyInRect(bounds, afterScreenUpdates: true) 
     var image: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     if let frame = frame { 
      // UIImages are measured in points, but CGImages are measured in pixels 
      let scaledRect = CGRectApplyAffineTransform(frame, CGAffineTransformMakeScale(scaleFactor, scaleFactor)) 

      if let imageRef = CGImageCreateWithImageInRect(image.CGImage, scaledRect) { 
       image = UIImage(CGImage: imageRef) 
      } 
     } 
     return image 
    } 
} 
+1

Hola, jDutton. Me encantó tu respuesta. Decidió actualizar su código para Swift 3.0. –

+0

¡Muchas gracias! – Jerome

0

SWIFT 3.0 Xcode8 Versión provienen de respuesta @jDutton y el trabajo para mí.

extension UIView { 
    func imageSnapshot() -> UIImage { 
     return self.imageSnapshotCroppedToFrame(frame: nil) 
    } 

    func imageSnapshotCroppedToFrame(frame: CGRect?) -> UIImage { 
     let scaleFactor = UIScreen.main.scale 
     UIGraphicsBeginImageContextWithOptions(bounds.size, false, scaleFactor) 
     self.drawHierarchy(in: bounds, afterScreenUpdates: true) 
     var image: UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
     UIGraphicsEndImageContext() 

     if let frame = frame { 
      // UIImages are measured in points, but CGImages are measured in pixels 
      let scaledRect = frame.applying(CGAffineTransform(scaleX: scaleFactor, y: scaleFactor)) 

      if let imageRef = image.cgImage!.cropping(to: scaledRect) { 
       image = UIImage(cgImage: imageRef) 
      } 
     } 
     return image 
    } 
} 

si te estrellas y obtener el siguiente mensaje:

GContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. 
CGContextRestoreGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. 

probar esto solution

esperanza para ahorrar su tiempo!

Cuestiones relacionadas