0

画像に消しゴムを実装する必要がある画像処理プロジェクトに取り組んでいます。また、画像を拡大または縮小するためにピンチ効果を実装する必要があります。ピンチはうまく機能しています。消しゴムも完璧に機能します。ピンチで画像を拡大縮小しない場合。しかし、ピンチを使用してから消しゴムを使用する場合。画像がぼやけます。に消しゴムを実装しましたUIPanGestureRecognizer

以下は消しゴムのコードです。

CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender locationInView:tattooImage];
if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan)
{
     lastPoint = translatedPoint;
     //lastPoint.x += 60;
     //lastPoint.y += 60;
}
else
{
     CGPoint currentPoint = translatedPoint;
     //currentPoint.x += 60;    
     //currentPoint.y += 60;

     UIGraphicsBeginImageContext(tattooImage.frame.size);
     [tattooImage.image drawInRect:CGRectMake(0, 0,tattooImage.frame.size.width, tattooImage.frame.size.height)];
     CGContextSetBlendMode(UIGraphicsGetCurrentContext( ),kCGBlendModeClear);
     CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
     CGContextSetLineWidth(UIGraphicsGetCurrentContext( ), 25.0);

     CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), [[UIColor clearColor] CGColor]);
     CGContextBeginPath(UIGraphicsGetCurrentContext());
     CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
     CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
     CGContextStrokePath(UIGraphicsGetCurrentContext()) ;

     tattooImage.image = UIGraphicsGetImageFromCurrentImageContext();
     UIGraphicsEndImageContext();

     lastPoint = currentPoint;
}

ヘルプを提供してください。前もって感謝します。

4

3 に答える 3

4

画像操作プログラムが機能する方法は、画面に表示されているもの(MSPaintを除く...)を直接操作するのではなく、すべての作業を1:1スケールのコピーに適用し、その拡大版を表示することです。 。

あなたがする必要があるのは、あなたが作業している画像を画面外に保存しておくことです。画面に表示される画像は、このソースからコピーする必要があります。

次に、画像に対してすべてのタッチイベントが比較的発生する場所を計算し、消去/描画を画面上の画像に直接適用する代わりに、適切に拡大縮小されたズームされていない画像に適用します。

次のようなもの:

  1. 作業用に画像のコピーを保存します。
  2. タッチの場所を取得します。
  3. ビュー内のスケール/位置に基づいて相対位置を計算します
  4. 保存されている画像のコピーに消しゴムタッチを適用します
  5. 現在のズームレベル/位置での画像の画面コピーを更新します。
于 2012-08-01T09:44:42.633 に答える
1

私は解決策を見つけました。私が行った小さな変更があり、望ましい結果が得られました。私はコードのどこでも変更tattooImage.frame.sizetattooImage.bounds.sizeました、そしてそれは完璧に機能しました。https://stackoverflow.com/users/1389202/pete-cに感謝します

于 2012-08-01T11:52:18.927 に答える
0

私には解決策があると思います。まずUIPanGestureRecognizer、オブジェクトを移動するためにを使用しています。UITouch実装が簡単になるという点で、単純に私たちにできます。私はいくつかのコードを提供しました:-

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{

    mouseSwiped = YES;

    UITouch *touch = [[event touchesForView:imageView] anyObject];
    CGPoint currentPoint = [touch locationInView:drawingView];

    UIGraphicsBeginImageContext(drawingView.frame.size);
    [drawingView.image drawInRect:CGRectMake(0, 0, drawingView.frame.size.width, drawingView.frame.size.height)];
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext( ), 5.0);
    if (eraserSelected)
    {
        CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);
        CGContextSetLineWidth(UIGraphicsGetCurrentContext( ), 10.0);
    }
    [self changeBrushColor];
    CGContextBeginPath(UIGraphicsGetCurrentContext());
    CGContextMoveToPoint(UIGraphicsGetCurrentContext() , lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext()) ;
    drawingView.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    lastPoint = currentPoint;  
    }

今、あなたはあなた自身touchesBegantouchesEnded方法を作ることができます。

于 2012-08-01T07:51:38.913 に答える