4

マルチタッチベースの写真調整プログラムを作成しました。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を設定することで、微調整された画像を再現できます。ここで、微調整した画像を1つの画像に再描画するために、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で取得できるもの)このスイートなどを検索して、回転の解決策をいくつか見つけましたが、どのタイプの変換にも一般的な解決策はありません。一部のメカニズムは回転に対してのみ機能し、一部は拡張に対して機能するなどです。UIImageView変換とCGContextConcatCTMの軸の違いが問題の原因になっているようです。しかし、それについての情報は見つかりませんでした。論理的には、コアグラフィックスとUIViewオリジンは同じである必要があります。

誰かが私に一般的な解決策は何ですか?

4

0 に答える 0