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;  
    }

现在您可以制作自己的touchesBegan方法touchesEnded

于 2012-08-01T07:51:38.913 回答