Recorta la image desde abajo programáticamente

Estoy trabajando en la aplicación de camera personalizada. Las cosas funcionan bien.

Pero me metí en el problema al recortar la image desde abajo. es decir, la image recortada tiene exactamente el mismo ancho que la image original, pero la altura será 1/3 de la image original y debe comenzar desde la parte inferior.

Por ejemplo Al igual que esta es la imagen completa Necesito la parte roja solamente

Solución Swift 3:

func cropBottomImage(image: UIImage) -> UIImage { let height = CGFloat(image.size.height / 3) let rect = CGRect(x: 0, y: image.size.height - height, width: image.size.width, height: height) return cropImage(image: image, toRect: rect) } 

Método de ayuda para recortar con un rect:

 func cropImage(image:UIImage, toRect rect:CGRect) -> UIImage{ let imageRef:CGImage = image.cgImage!.cropping(to: rect)! let croppedImage:UIImage = UIImage(cgImage:imageRef) return croppedImage } 

esta es casi la respuesta de Alexburtnik

pero solo para mencionar que UIImage.size es el tamaño lógico (en "puntos")

Sin embargo, CGImage.cropping () usó la dimensión real (en "píxeles")

por lo tanto, si usa una image con modificadores @ 2x o @ 3x, encontrará que el recorte es en realidad la mitad o un tercio de la expectativa.

así que cuando recorte, puede considerar multiplicar el rectángulo por la propiedad de "escala" de la image primero, como lo siguiente:

 func cropImage(image:UIImage, toRect rect:CGRect) -> UIImage? { var rect = rect rect.size.width = rect.width * image.scale rect.size.height = rect.height * image.scale guard let imageRef = image.cgImage?.cropping(to: rect) else { return nil } let croppedImage = UIImage(cgImage:imageRef) return croppedImage } 

Método:

 func croppIngimage(ImageCrop:UIImage, toRect rect:CGRect) -> UIImage{ var imageRef:CGImageRef = CGImageCreateWithImageInRect(imageToCrop.CGImage, rect) var croppedimage:UIImage = UIImage(CGImage:imageRef) return croppedimage } 

Llamada :

 var ImageCrop:UIImage = UIImage(named:"image.png")