2011-04-25 15 views
10

Estoy escribiendo una aplicación de iPhone que utiliza AVFoundation para tomar una foto y recortarla. La aplicación es similar a un lector de códigos QR: utiliza una AVCaptureVideoPreviewLayer con una superposición. La superposición tiene un cuadrado. Quiero recortar la imagen para que la imagen recortada sea exactamente la que tiene el usuario dentro del cuadrado.Recortar imagen capturada por AVCaptureSession

La capa de vista previa tiene la gravedad AVLayerVideoGravityResizeAspectFill.

Parece que lo que la cámara realmente captura no es exactamente lo que el usuario ve en la capa de vista previa. Esto significa que necesito pasar del sistema de coordenadas de vista previa al sistema de coordenadas de la imagen capturada para poder recortar la imagen. Para esto, creo que necesito los siguientes parámetros: 1. ración entre el tamaño de la vista y el tamaño de la imagen capturada. 2. información que indica qué parte de la imagen capturada coincide con la que se muestra en la capa de vista previa.

¿Alguien sabe cómo puedo obtener esta información, o si hay un enfoque diferente para recortar la imagen.

(p.s.) capturar una captura de pantalla de la vista previa no es una opción, ya que entiendo que podría resultar en la rechazo de la aplicación).

gracias de antemano

Respuesta

5

Esperanza esta se adapte a sus necesidades

- (UIImage *)cropImage:(UIImage *)image to:(CGRect)cropRect andScaleTo:(CGSize)size { 
    UIGraphicsBeginImageContext(size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGImageRef subImage = CGImageCreateWithImageInRect([image CGImage], cropRect); 
    NSLog(@"---------");  
    NSLog(@"*cropRect.origin.y=%f",cropRect.origin.y); 
    NSLog(@"*cropRect.origin.x=%f",cropRect.origin.x); 

    NSLog(@"*cropRect.size.width=%f",cropRect.size.width);  
    NSLog(@"*cropRect.size.height=%f",cropRect.size.height);  

    NSLog(@"---------");  

    NSLog(@"*size.width=%f",size.width);  
    NSLog(@"*size.height=%f",size.height);  

    CGRect myRect = CGRectMake(0.0f, 0.0f, size.width, size.height); 
    CGContextScaleCTM(context, 1.0f, -1.0f); 
    CGContextTranslateCTM(context, 0.0f, -size.height); 
    CGContextDrawImage(context, myRect, subImage); 
    UIImage* croppedImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    CGImageRelease(subImage);  

    return croppedImage; 
} 
+0

no ayudaría como la cámara también gira la imagen. Consulte una pregunta similar aquí http://cmgresearch.blogspot.co.il/2012/07/cropping-results-from.html – Dejell

1

Creo que esto es sólo simple como esto

- (CGRect)computeCropRect:(CGImageRef)cgImageRef 
{ 
    static CGFloat cgWidth = 0; 
    static CGFloat cgHeight = 0; 

    static CGFloat viewWidth = 320; 

    if(cgWidth == 0) 
     cgWidth = CGImageGetWidth(cgImageRef); 

    if(cgHeight == 0) 
     cgHeight = CGImageGetHeight(cgImageRef); 

    CGRect cropRect; 

    // Only based on width 
    cropRect.origin.x = cropRect.origin.y = kMargin * cgWidth/viewWidth; 
    cropRect.size.width = cropRect.size.height = kSquareSize * cgWidth/viewWidth; 

    return cropRect; 
} 

con kMargin y kSquareSize (20point y 280point en mi caso) son el margen y el área de escaneo respectivamente

A continuación, realice cro pping

CGRect cropRect = [self computeCropRect:cgCapturedImageRef]; 
CGImageRef croppedImageRef = CGImageCreateWithImageInRect(cgCapturedImageRef, cropRect); 
Cuestiones relacionadas