Ios 利用变换从UIImageView中提取图像

Ios 利用变换从UIImageView中提取图像,ios,uiimageview,transform,cgcontextdrawimage,Ios,Uiimageview,Transform,Cgcontextdrawimage,我写了一个基于多点触摸的照片调整程序。 UIImageView显示照片时,根据用户触摸设置变换值,以展开/收缩图像。 下面是一些处理多点触摸的代码 -(void) viewPanned:(UIPanGestureRecognizer *)g { CGPoint translate = [g translationInView:imageView]; CGAffineTransform nt = CGAffineTransformMake(1.0, 0, 0, 1.0, tran

我写了一个基于多点触摸的照片调整程序。 UIImageView显示照片时,根据用户触摸设置变换值,以展开/收缩图像。 下面是一些处理多点触摸的代码

-(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 ;
    }
}
因此,程序将保留原始照片并更改变换值以显示调整。最后得到原始图像和变换值作为结果。 至于使用UIImageView,我可以通过将.image设置为原始照片,并将.transform设置为调整的结果来复制调整后的图像。现在,为了将调整后的图像重绘为单个图像,我尝试使用CGContextConcatCTM将变换应用于绘图图像

-(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 ;
} 
然后我得到了一个错误的图像,在大多数情况下,结果是从我预期的图像位移。(使用UIImageView和transform可以得到什么) 我搜索了这个套件和其他套件,找到了一些旋转的解决方案,但是没有任何类型的转换的通用解决方案。有些机构仅用于旋转,有些机构用于膨胀等。 UIImageView变换和CGContextConcatCTM之间的轴差异似乎是导致问题的原因。但我找不到任何有关这方面的信息。从逻辑上讲,核心图形和UIView原点应该相同

有人能告诉我什么是通用解决方案吗