擦除在图像视图上绘制

时间:2015-01-21 12:49:18

标签: ios objective-c core-graphics

所以,我正在开发一个虚拟壁画应用程序。

我可以通过在图像视图上移动手指来绘制一些随机线条(图像中包含图像)。现在我正试图擦除其上的图纸,但尚未成功。

我用谷歌搜索找到了一些解决方案,下面的这一行是完整的建议: -

CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeClear);

使用此图形可以删除,但它也会删除完成绘图的图像。有没有办法防止图像被删除?只删除它上面的图纸?

以下是我用来删除图纸的代码: -

touchesMoved: -

UITouch *touch = [touches anyObject];
CGPoint previousPoint = [touch locationInView:self.upperImageView];
UIGraphicsBeginImageContext(self.upperImageView.frame.size);
[self.upperImageView.image drawInRect:CGRectMake(0, 0, self.upperImageView.frame.size.width, self.upperImageView.frame.size.height)];

CGContextSaveGState(UIGraphicsGetCurrentContext());
CGContextSetShouldAntialias(UIGraphicsGetCurrentContext(),YES);
CGContextSetLineCap(UIGraphicsGetCurrentContext(), eraserCap);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 45.0);
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.25, 0.25, 0.25, 1.0);
CGMutablePathRef pathB = CGPathCreateMutable();
CGPathMoveToPoint(pathB,nil,location.x,location.y);
CGPathAddLineToPoint(pathB,nil,previousPoint.x,previousPoint.y);
CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);
CGContextAddPath(UIGraphicsGetCurrentContext(),pathB);
CGContextStrokePath(UIGraphicsGetCurrentContext());
upperImageView.image = UIGraphicsGetImageFromCurrentImageContext();
CGContextRestoreGState(UIGraphicsGetCurrentContext());
UIGraphicsEndImageContext();
location = previousPoint;

并在touchesEnded: -

UITouch *touch = [touches anyObject];
CGPoint previousPoint = [touch locationInView:self.upperImageView];
UIGraphicsBeginImageContext(self.upperImageView.frame.size);
[self.upperImageView.image drawInRect:CGRectMake(0, 0, self.upperImageView.frame.size.width, self.upperImageView.frame.size.height)];
CGContextSaveGState(UIGraphicsGetCurrentContext());
CGContextSetShouldAntialias(UIGraphicsGetCurrentContext(), YES);
CGContextSetLineCap(UIGraphicsGetCurrentContext(), eraserCap);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0);
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0,1.0,1.0, 0.0);
CGMutablePathRef pathB = CGPathCreateMutable();
CGPathMoveToPoint(pathB, nil, location.x, location.y);
CGPathAddLineToPoint(pathB, nil, previousPoint.x, previousPoint.y);
CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);
CGContextAddPath(UIGraphicsGetCurrentContext(),pathB);
CGContextStrokePath(UIGraphicsGetCurrentContext());
self.upperImageView.image = UIGraphicsGetImageFromCurrentImageContext();
// CGContextRestoreGState(UIGraphicsGetCurrentContext());
UIGraphicsEndImageContext();
previousPoint = location;

我做错了什么吗?请在这里指导我正确的方向,任何帮助将真正感激。

2 个答案:

答案 0 :(得分:0)

您可以为图像和绘图使用不同的视图。 或者在数组中保留绘制的路径并分别删除每个路径。

答案 1 :(得分:0)

将您的所有绘图移动到覆盖UIView的单独UIImageView。这样,当你去"清除"内容,原始的UIImageView在下面仍然完好无损。

这样的事情会让你设置:

- (void)viewWillAppear {
    // Assumes you add a property of type UIView
    self.drawingView = [[UIView alloc] initWithFrame:self.upperImageView.bounds];
    [self.upperImageView addSubview:drawingView];

}

然后,您的绘图代码只需更改为此(请注意您不再需要重新绘制图像):

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint previousPoint = [touch locationInView:self.drawingView];
    UIGraphicsBeginImageContext(self.drawingView.frame.size);
    CGContextSaveGState(UIGraphicsGetCurrentContext());
    CGContextSetShouldAntialias(UIGraphicsGetCurrentContext(),YES);
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), eraserCap);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 45.0);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.25, 0.25, 0.25, 1.0);
    CGMutablePathRef pathB = CGPathCreateMutable();
    CGPathMoveToPoint(pathB,nil,location.x,location.y);
    CGPathAddLineToPoint(pathB,nil,previousPoint.x,previousPoint.y);
    CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);
    CGContextAddPath(UIGraphicsGetCurrentContext(),pathB);
    CGContextStrokePath(UIGraphicsGetCurrentContext());
    upperImageView.image = UIGraphicsGetImageFromCurrentImageContext();
    CGContextRestoreGState(UIGraphicsGetCurrentContext());
    UIGraphicsEndImageContext();
    location = previousPoint;
}

touchesEnded:方法中进行类似的更改。