Recorte de imágenes UIImageView basado en la máscara UIView

Así que tengo un canvas (UIView) y un UIImageView, el canvas actúa como una máscara sobre la image

introduzca la descripción de la imagen aquí

Estoy usando UIGestureRecognizers para hacer zoom y girar el UIImageView que está debajo del canvas.

Quiero convertir la image final (mostrar en el canvas a un UIImage, una solución es convertir el canvas a una image como la siguiente

UIGraphicsBeginImageContext(self.canvas.bounds.size); [self.canvas.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *newCombinedImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); 

ahora esto funciona bien, pero el problema con esta solución es que la image se recorta en las dimensiones del canvas, por lo que la resolución es muy baja.

Otra opción que exploré era usar algunas categorías UIImage personalizadas para rotar y escalar.

 [[[self.photoImage image] imageRotatedByDegrees:rotaton_angle] imageAtRect:CGRectMake(x,y width,height)] 

Necesito proporcionar un ángulo de rotation (el ángulo de rotation proporcionado por UIGesture Delegate no está en Degrees o Radians, entonces hay x, y, width, height, imagino que estas necesidades deben calcularse en base a alguna escala, (obtengo el valor de escala del delegado de UIGesture pero no parecen ser correctos para esta function)

hay una serie de soluciones aquí, que le guían a recortar e image dada un rect. pero en mi caso el rectángulo no es la misma escala que la image, también hay rotation involucrada.

cualquier ayuda será apreciada.

He logrado resolver esto, aquí está mi solución, definitivamente no es la más limpia, pero funciona.

Necesitaba manejar 3 cosas, pan, zoom y rotar.

en primer lugar utilicé el UIGestureRecognizer Delegate para get incrementos de los valores acumulativos en UIGestureRecognizerStateEnded para todos los 3.

entonces, para la rotation, acabo de usar la categoría UIImage discutida aquí

  self.imagetoEdit = [self.imagetoEdit imageRotatedByRadians:total_rotation]; 

para hacer zoom (escala) usé GPUImage (estoy usando esto en toda la aplicación)

 GPUImageTransformFilter *scaleFilter = [[GPUImageTransformFilter alloc] init]; [scaleFilter setAffineTransform:CGAffineTransformMakeScale(total_scale, total_scale)]; [scaleFilter prepareForImageCapture]; self.imagetoEdit = [scaleFilter imageByFilteringImage:self.imagetoEdit]; 

Por paneo, estoy haciendo esto. (No es el código más limpio: S) también utilizando las menciones anteriores UIImage + Categories.

 CGFloat x_ = (translation_point.x/canvas.frame.size.width)*self.imagetoEdit.size.width; CGFloat y_ = (translation_point.y/canvas.frame.size.height)*self.imagetoEdit.size.height; CGFloat xx = 0; CGFloat yy = 0; CGFloat ww = self.imagetoEdit.size.width-x_; CGFloat hh = self.imagetoEdit.size.height-y_; if (translation_point.x < 0) { xx = x_*-1; ww = self.imagetoEdit.size.width + xx; } if (translation_point.y < 0) { yy = y_*-1; hh = self.imagetoEdit.size.height + yy; } CGRect cgrect = CGRectMake(xx,yy, ww, hh); self.imagetoEdit = [self.imagetoEdit imageAtRect:cgrect]; 

todo parece funcionar.

Esto podría ser útil … Cambiar el tamaño de un UIImage de la manera correcta

Puede que necesite algunas actualizaciones para ARC, etc. aunque creo que hay personas que lo han hecho y lo han publicado en Github.