2011-08-29 93 views
7

我正在绘制一个路径到CGContext,遵循从用户收集的一组点。似乎有一些随机输入抖动会导致一些线边缘看起来锯齿状。我认为有一点轻松会解决这个问题。如果我使用的是OpenGL ES,我会简单地将羽毛应用到我正在抚摸路径的精灵上;然而,这个项目需要我留在Quartz/CoreGraphics中,我似乎无法找到类似的解决方案。iOS Quartz/CoreGraphics绘制羽毛笔画

我已经尝试绘制5条线,每条线略大一些,透明度接近羽毛。这会产生不好的结果,并会显着降低性能。

这是线描代码:

CGContextMoveToPoint(UIGraphicsGetCurrentContext(),((int)lastPostionDrawing1.x), (((int)lastPostionDrawing1.y))); 
CGContextAddCurveToPoint(UIGraphicsGetCurrentContext(), ctrl1_x, ctrl1_y, ctrl2_x, ctrl2_y, lastPostionDrawing2.x, lastPostionDrawing2.y; 
[currentPath addCurveToPoint:CGPointMake(lastPostionDrawing2.x-((int)furthestLeft.x)+((int)penSize), lastPostionDrawing2.y controlPoint1:CGPointMake(ctrl1_x, ctrl1_y) controlPoint2:CGPointMake(ctrl2_x, ctrl2_y)]; 
+0

你有没有试过CGContextSetShouldAntialias函数? – Davyd

+0

在过去,我有类似的问题使用四条曲线或2个控制点的曲线。如果你发给我你想绘制的.svg或者至少是你想要绘制的羽毛的更多信息,我可以帮忙 – GianPac

回答

2

我要继续前进,假设你的CGContext上仍具有抗锯齿开启,但如果没有,那么这是明显的先想尝试,正如@ Davyd的评论所暗示的那样:CGContextSetShouldAntialias是感兴趣的功能。

假设这不是问题,并且该行正被上下文反锯齿化,但是您仍然希望某个东西“更柔和”。我可以想出几种方法来做到这一点,希望能比5次更快地做到这一点。

首先,您可以尝试使用CGContextReplacePathWithStrokedPath获取描边路径(即描述当前路径的描边轮廓的路径),然后可以使用渐变填充此路径(或任何其他填充技术可提供所需结果)这对于直线很好,但对于曲线路径不会很直接(因为梯度正在填充描边路径的区域,并且将是线性或径向的)。

另一个可能不太明显的选项,可能是为了这个目的滥用CG的阴影画。您要查找的功能是:CGContextSetShadowWithColor这里的方法:

  • 保存GState:CGContextSaveGState
  • 获取原始路径
  • 复制路径的边框,2.0从自身翻译它拿走* bbox.width使用CGPathCreateCopyByTransformingPath(注:仅使用X方向,这样你就不需要担心翻转的情况下)
  • 剪辑的背景下使用CGContextClipToRect
  • 坐落在一个阴影原BBOX上下文无线th CGContextSetShadowWithColor
    • 一些最小的模糊(从0.5开始并从那里开始。模糊参数是非线性的,IME它是一种猜测和检查操作)
    • 偏移量等于-2.0 * bbox宽度和0.0高度,缩放到基本空间。 (注意:这些偏移量位于基本空间中,这会让人发疯,但假设你没有添加自己的缩放变换,缩放因子将为1.0或2.0,所以实际上,您将设置一个offset.width为-2.0 * bbox.width或-4.0 * bbox.width)
    • 您选择的颜色。
  • 描边翻译后的路径。
  • 弹出GState CGContextRestoreGState

这应该离开你“只是”影子,你可以希望调整来实现你想要的结果。所有这一切说,CG的阴影绘制性能是IME,并不是完全可怕的,并不是完全确定性的。我希望它比用5种不同的笔画抚摸5次路径要快,但绝不是如此。

它会降低多少实现这种效果值得你。