Extraer image de UIImageView con transformar

Escribí un progtwig de retoque fotográfico basado en múltiples tactos. Con UIImageView mostrando una foto, el valor de transformación se establece de acuerdo con el toque del usuario para expandir / networkingucir la image. Aquí hay un código que maneja el multitáctil.

-(void) viewPanned:(UIPanGestureRecognizer *)g { CGPoint translate = [g translationInView:imageView]; CGAffineTransform nt = CGAffineTransformMake(1.0, 0, 0, 1.0, translate.x, translate.y ) ; imageView.transform = CGAffineTransformConcat( transform, nt ) ; if( g.state == UIGestureRecognizerStateEnded ) { transform = imageView.transform ; } } -(void) viewPinched:(UIPinchGestureRecognizer *)g { switch (g.state) { case UIGestureRecognizerStateBegan: { startScale = g.scale ; } break; case UIGestureRecognizerStateChanged: { CGFloat change = g.scale ; switch( currentMode ) { case 0: imageView.transform = CGAffineTransformScale( transform, change, change ) ; break ; case 1: imageView.transform = CGAffineTransformScale( transform, change, 1.0 ) ; break ; case 2: imageView.transform = CGAffineTransformScale( transform, 1.0, change ) ; break ; } } break ; case UIGestureRecognizerStateEnded: { transform = imageView.transform ; } default: break; } } -(void) viewRotated:(UIRotationGestureRecognizer *)g { CGFloat rotation = g.rotation ; imageView.transform = CGAffineTransformRotate(transform, rotation) ; if( g.state == UIGestureRecognizerStateEnded ) { transform = imageView.transform ; } } 

Entonces, el progtwig mantiene la foto original y cambia el valor de transformación para mostrar el ajuste. Al final, obtuve la image original y el valor de transformación como resultado. En cuanto a la utilización de UIImageView, puedo reproducir la image retocada, configurando .image como la foto original y .transform como resultado de retocar. Ahora, para volver a dibujar la image retocada en una sola image, bash usar CGContextConcatCTM para aplicar la transformación a la image del dibujo.

 -(UIImage *)shrinkImage:(UIImage *)img size:(CGSize)size transform:(CGAffineTransform)transform { UIImage *sImage ; CGSize trSize = CGSizeApplyAffineTransform( size, transform ) ; UIGraphicsBeginImageContext(trSize) ; CGContextRef context = UIGraphicsGetCurrentContext(); CGAffineTransform tr = CGAffineTransformIdentity; //tr = CGAffineTransformTranslate(tr, trSize.width/2, trSize.height/2); // only works on rotate tr = CGAffineTransformConcat(tr , transform); //tr = CGAffineTransformScale(tr, 1.0, -1.0); CGContextConcatCTM(context, tr); CGRect rect ; rect.origin = CGPointZero ; rect.size = size ; [img drawInRect:rect] ; //CGContextDrawImage(context, rect, img.CGImage); // no difference sImage = UIGraphicsGetImageFromCurrentImageContext() ; UIGraphicsEndImageContext() ; return sImage ; } 

Entonces obtuve una image incorrecta, la mayor parte del caso el resultado se desplaza de la image que esperaba. (Lo que pude get con UIImageView con transform) Busqué en este set y otros, y encontré algunas soluciones para la rotation, pero no hay una solución genérica para ningún tipo de transformación. Algunos mecanismos solo funcionan para rotation, algunos funcionan para expansión, etc. Parece que la diferencia de eje entre UIImageView transform y CGContextConcatCTM está causando el problema. Pero no pude encontrar ninguna información al respecto. Los charts lógicamente Core y el origen de UIView deberían ser los mismos.

¿Alguien puede decirme cuál es la solución genérica?