Recorta la image en un cuadrado de acuerdo con el tamaño de una UIView / CGRect

Tengo una implementación de AVCaptureSession y mi objective es que el usuario tome una foto y solo guarde la parte de la image dentro del borde cuadrado rojo, como se muestra a continuación:

UIViewController con una implementación de AVCaptureSession

La previewLayer previa de previewLayer (la camera) abarca desde (0,0) (arriba a la izquierda) hasta la parte inferior de la barra de controles de mi camera (la barra justo encima de la vista que contiene el obturador). Mi barra de navigation y la barra de controles son semitransparentes, por lo que la camera puede mostrarse.

Estoy usando [captureSession setSessionPreset:AVCaptureSessionPresetPhoto]; para asegurarse de que la image original que se guarda en el rollo de la camera es como la camera de Apple.

El usuario podrá tomar la foto en retrato, horizontal izquierdo y derecho, por lo que el método de recorte debe tener esto en count.

Hasta ahora, he tratado de recortar la image original con este código:

 DDLogVerbose(@"%@: Image crop rect: (%f, %f, %f, %f)", THIS_FILE, self.imageCropRect.origin.x, self.imageCropRect.origin.y, self.imageCropRect.size.width, self.imageCropRect.size.height); // Create new image context (retina safe) UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.imageCropRect.size.width, self.imageCropRect.size.width), NO, 0.0); // Create rect for image CGRect rect = self.imageCropRect; // Draw the image into the rect [self.captureManager.stillImage drawInRect:rect]; // Saving the image, ending image context UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext(); 

Sin embargo, cuando miro la image recortada en el rollo de la camera, parece que acaba de aplastar la image original y no descarta las partes superior e inferior de la image como me gustaría. También resulta en 53 píxeles de espacio en blanco en la parte superior de la image "recortada", probablemente debido a la position y de mi CGRect .

Esta es mi salida de logging para el CGRect :

  Image crop rect: (0.000000, 53.000000, 320.000000, 322.000000) 

Esto también describe el marco de la vista con borde rojo en la vista de supervisión.

¿Hay algo crucial que estoy pasando por alto?

PS El tamaño de la image original (tomada con una camera en modo vertical) es:

 Original image size: (2448.000000, 3264.000000) 

Puede recortar imágenes con CGImageCreateWithImageInRect :

 CGImageRef imageRef = CGImageCreateWithImageInRect([uncroppedImage CGImage], bounds); UIImage *croppedImage = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); 

No olvide agregar un parámetro de escala, de lo contrario obtendrá una image de baja resolución

 CGImageRef imageRef = CGImageCreateWithImageInRect([uncroppedImage CGImage], CGRectMake(0, 0, 30, 120)); [imageView setImage:[UIImage imageWithCGImage:imageRef scale:[[UIScreen mainScreen] scale] orientation:UIImageOrientationUp]]; CGImageRelease(imageRef); 

Swift 3:

 let imageRef:CGImage = uncroppedImage.cgImage!.cropping(to: bounds)! let croppedImage:UIImage = UIImage(cgImage: imageRef)