2012-10-02 30 views
12

Tengo una aplicación que toma una captura de pantalla de un UIImageView con el siguiente código:iOS Captura parte de la pantalla

-(IBAction) screenShot: (id) sender{ 

UIGraphicsBeginImageContext(sshot.frame.size); 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
UIImageWriteToSavedPhotosAlbum(viewImage,nil, nil, nil); 


} 

Esto funciona bien, pero tengo que ser capaz de posicionarse en donde tomo la pantalla, básicamente, necesita graduar solo un tercio de la pantalla (parte central). He intentado utilizar

UIGraphicsBeginImageContext(CGSize 150,150); 

Pero he encontrado que cada cosa se toma de coordenadas 0,0, Alguien alguna idea de cómo posicionar de manera correcta.

+0

El mismo problema se produce para mí y no he podido encontrar ninguna solución. –

Respuesta

29

Bueno, la captura de pantalla se toma de un lienzo que dibuja. Así que en lugar de sacar su capa en todo el contexto, con una referencia a la esquina superior izquierda, tendrá que dibujar el lugar que desee tomar la captura de pantalla ....

//first we will make an UIImage from your view 
UIGraphicsBeginImageContext(self.view.bounds.size); 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *sourceImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

//now we will position the image, X/Y away from top left corner to get the portion we want 
UIGraphicsBeginImageContext(sshot.frame.size); 
[sourceImage drawAtPoint:CGPointMake(-50, -100)]; 
UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
UIImageWriteToSavedPhotosAlbum(croppedImage,nil, nil, nil); 
+0

Gracias por su ayuda. – yeha

+2

¿Qué es 'sshot.frame.size'? ¿Querías decir 'self.view.frame.size'? – progrmr

+0

Tiene el tamaño de la captura de pantalla. Puede cambiar esa línea a 'UIGraphicsBeginImageContext (CGSizeMake (200,200)); ' para hacer una imagen de captura de pantalla 200X200 – Lefteris

14

De this

UIGraphicsBeginImageContext(sshot.frame.size); 
CGContextRef c = UIGraphicsGetCurrentContext(); 
CGContextTranslateCTM(c, 150, 150); // <-- shift everything up to required position when drawing. 
[self.view.layer renderInContext:c]; 
UIImage* viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil); 
+0

Sí, esta es realmente una mejor solución – Lefteris

+0

parece una buena solución. –

7

utilizar este método para recortar si tienes imagen con rect specfic para recortar:

-(UIImage *)cropImage:(UIImage *)image rect:(CGRect)cropRect 
{ 
    CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropRect); 
    UIImage *img = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef); 
    return img; 
} 

uso como esto:

UIImage *img = [self cropImage:viewImage rect:CGRectMake(150,150,100,100)]; //example 
+0

Gracias por su ayuda. – yeha

0

Si lo desea, puede referirse al código this.

En este ejemplo, puede obtener la imagen cubierta por el rect desde cualquier posición y cualquier escala de zoom.

feliz :) Codificación

Parte del código extraído de referencia es la siguiente

Función principal o código utilizado para recortar la foto

- (UIImage *) croppedPhoto 
{ 
    CGFloat ox = self.scrollView.contentOffset.x; 
    CGFloat oy = self.scrollView.contentOffset.y; 
    CGFloat zoomScale = self.scrollView.zoomScale; 
    CGFloat cx = (ox + self.cropRectangleButton.frame.origin.x + 15.0f) * 2.0f/zoomScale; 
    CGFloat cy = (oy + self.cropRectangleButton.frame.origin.y + 15.0f) * 2.0f/zoomScale; 
    CGFloat cw = 300.0f/zoomScale; 
    CGFloat ch = 300.0f/zoomScale; 
    CGRect cropRect = CGRectMake(cx, cy, cw, ch); 

    NSLog(@"---------- cropRect: %@", NSStringFromCGRect(cropRect)); 
    NSLog(@"--- self.photo.size: %@", NSStringFromCGSize(self.photo.size)); 

    CGImageRef imageRef = CGImageCreateWithImageInRect([self.photo CGImage], cropRect); 
    UIImage *result = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef); 

    NSLog(@"------- result.size: %@", NSStringFromCGSize(result.size)); 

    return result; 
} 

Los detalles de cómo utilizar el ejemplo se da here .

Enjoy Coding :)

Cuestiones relacionadas