如何将路径重新划线到另一种颜色并获得完全相同的结果?

时间:2015-01-06 22:13:41

标签: ios objective-c core-graphics

我正在开发一个涉及绘制线条的应用程序。每次用户移动手指时,该点都会添加到路径中,并且还会添加到CGContext中,如下例所示。

CGContextMoveToPoint(cacheContext, point1.x, point1.y);
CGContextAddCurveToPoint(cacheContext, ctrl1_x, ctrl1_y, ctrl2_x, ctrl2_y, point2.x, point2.y);
CGPathMoveToPoint(path, NULL, point1.x, point1.y);
CGPathAddCurveToPoint(path, NULL, ctrl1_x, ctrl1_y, ctrl2_x, ctrl2_y, point2.x, point2.y);

现在,当我想添加它并将其描边为黑色时,我使用以下代码

CGContextSetStrokeColorWithColor([UIColor blackcolor].CGColor)
CGContextAddPath(cacheContext,path);
CGContextStrokePath(cacheContext);

然而,这次被描边的线将比之前绘制的线稍微小一些。这将导致描边路径周围的轻微边框。所以我的问题是:如何让描边路径与绘制到CGcontext中的路径相同?

1 个答案:

答案 0 :(得分:3)

问题是由于抗锯齿造成的。这条路是几何理想的。通过用给定的宽度,颜色等描绘路径而生成的位图是不完美的。理想的形状完全覆盖了一些像素,但仅部分覆盖了其他像素。

没有抗锯齿(并假设不透明的颜色)的结果是完全绘制大部分位于理想形状内的像素,并且不接触大多数位于其外部的像素。除了垂直或水平线以外,其他任何东西都会留下明显的锯齿状。如果稍后再次使用相同的笔触参数绘制相同的路径,则会影响完全相同的像素,并且由于它们已完全绘制,因此您可以使用新绘图完全替换旧图形。

使用抗锯齿功能时,任何仅部分在理想形状内的像素都不会完全涂上新颜色。而是,笔划颜色与在理想形状内的像素的百分比成比例地应用。已经在该像素中的颜色以反比例保留。例如,理想形状中43%的像素将获得一个颜色,该颜色是笔画颜色的43%加上之前颜色的57%。

这意味着用不同的颜色第二次抚摸路径不会完全取代前一个笔划的颜色。如果用白色填充位图然后用红色描边路径,沿着边缘的一些像素会混合一点红色和一点白色,以呈现浅红色或粉红色。如果你然后用蓝色划过那条路径,沿着边缘的像素会混合一点点蓝色和那里的一点颜色,这是浅红色或粉红色。这将产生洋红色。

您可以使用CGContextSetShouldAntialias()禁用抗锯齿,但是您可能会遇到锯齿现象。你必须围绕这两条路径进行这项工作。

或者,您可以在重绘路径之前将上下文清除为某种背景颜色。但为此,您需要能够完全重绘您想要出现的所有内容。