触摸点在UIView上进行绘制会导致边界模糊的绘图效果

7
为了解决我上一个问题:在UIView中像素画一条贝塞尔曲线并填充颜色,我使用带有选定颜色的精确图像(路径)。然后,为了在UIView中绘制它,我选择了以下上下文颜色:
lineColor=[UIColor colorWithPatternImage:img];

在drawrect方法中:

CGPoint mid1 = midPoint(previousPoint1, previousPoint2);
CGPoint mid2 = midPoint(currentPoint, previousPoint1);
[curImage drawInRect:CGRectZero];
CGContextRef context = UIGraphicsGetCurrentContext();
[self.layer renderInContext:context];
CGContextMoveToPoint(context, mid1.x, mid1.y);
CGContextAddQuadCurveToPoint(context, 
                             previousPoint1.x, 
                             previousPoint1.y, 
                             mid2.x, 
                             mid2.y);
CGContextSetLineCap(context, kCGLineCapRound);
CGContextSetBlendMode(context, kCGBlendModeCopy);
CGContextSetLineJoin(context, kCGLineJoinRound);
CGContextSetLineWidth(context, self.lineWidth);
CGContextSetStrokeColorWithColor(context,lineColor.CGColor);
CGContextSetShouldAntialias(context, YES);
CGContextSetAllowsAntialiasing(context, YES);
CGContextSetFlatness(context,0.5);
CGContextSetAlpha(context, 1.0);
CGContextStrokePath(context);

它在视图路径中精确绘制,但在边界处,颜色会像融化效应一样溢出。

要填充颜色的源图像: Image to be filled with color

用作colorWithPatternImage(img)的图像: enter image description here

在触摸上绘制后,结果图像为: enter image description here

我在这里缺少什么才能完美填充它? 欢迎任何有关核心图形的帮助! 谢谢!

为了遮罩图像,我还做了以下操作:

-(void)clipView :(MyUIBezierPath*)path drawingView:(DrawingView*)myView
{
    MyUIBezierPath *myClippingPath =path;
    CAShapeLayer *mask = [CAShapeLayer layer];
    mask.path = myClippingPath.CGPath;
    myView.layer.mask = mask;
}

但是使用colorWithPatternImage和遮罩可以实现相同的效果,即让我只在路径内绘制,但现在我面临的问题是:在路径边界附近的触摸点上绘制会产生不良效果!


你应该将剪切蒙版应用于图层,这样你只能看到它在贝塞尔曲线内部绘制。请参阅https://dev59.com/PmIj5IYBdhLWcg3wTTcG。 - Rory McKinnel
我已经尝试过了。这个问题还是一样,路径周围的颜色仍然感觉像在流动,不过不是从外面流开,而是从内部流离路径边界。问题出在触摸点的绘制上,遮罩不是问题。 - user3978087
关闭抗锯齿后是否一样? - Rory McKinnel
是的,我尝试过:CGContextSetShouldAntialias(context, NO); CGContextSetAllowsAntialiasing(context, NO); 但这也没有帮助!! - user3978087
2个回答

1

虽然通过colorWithPatternImage使用自己的遮罩方法可以使其正常工作,但是通过剪切来进行遮罩也是一样的。绘图问题是因为在方法“calculateMinImageArea:CGPoint1:CGPoint2:CGPoint3”中,在触摸点处绘制图像导致的。改变其尺寸(根据线宽调整高度-宽度)可以解决这个问题。


0
你可以从这张图片中创建路径点。然后创建一个CGPathRefCGMutablePathRef,并将其用作掩码应用于你的CGContextRef

从哪个图像创建路径? - user3978087
请将您发布的源图像翻译成中文。 - CodenameLambda1
我已经存储了路径,只有这样我才能获取第二张图片。问题在于不断调用touches moved以绕过边界,颜色开始流出。请参见我的链接问题,了解我如何在drawRect中进行绘制。 - user3978087
如果你有路径,那么你可以尝试像我上面的回答中所述的那样进行掩码处理。 - CodenameLambda1
正如我所提到的,遮罩现在不是问题,用这种方式进行遮罩或获取图像并使用colorwithpatternimage执行相同的任务,问题在于绘制技术!在路径内部它可以正常工作,但在边界上,在移动触摸时,会产生一种颜色流动的效果,就像您在最后一张图片中看到的那样! - user3978087

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接