iOS Quartz / CoreGraphics绘制羽毛笔画

时间:2011-08-29 16:59:35

标签: objective-c ios drawing quartz-graphics smooth

我正在根据从用户收集的一组点绘制一条CGContext路径。似乎有一些随机输入抖动导致一些线边看起来呈锯齿状。我认为轻微的羽毛可以解决这个问题。如果我使用的是OpenGL ES,我会简单地将一个羽毛应用于我正在用它追踪路径的精灵;但是,这个项目要求我留在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)];

1 个答案:

答案 0 :(得分:2)

我将继续并假设您的CGContext仍然启用了抗锯齿功能,但如果没有,那么这是首先想到的尝试,正如@Davyd的评论所暗示的那样:CGContextSetShouldAntialias是函数感兴趣的。

假设这不是问题,并且该行正在被上下文消除锯齿,但你仍然想要一些“更软”的东西。我可以想到几种方法来做到这一点,希望比抚摸5次更快。

首先,您可以尝试使用CGContextReplacePathWithStrokedPath来获取描边路径(即描述当前路径笔划轮廓的路径),然后可以使用渐变(或任何其他填充技术)来填充此路径期望的结果。)这对于直线很有效,但对于弯曲路径不会很简单(因为渐变填充了描边路径的区域,并且将是线性或径向的。)

另一个可能不那么明显的选择,可能就是为了这个目的滥用CG的阴影画。您要查找的功能是:CGContextSetShadowWithColor以下是方法:

  • 保存GState:CGContextSaveGState
  • 获取原始路径的边界框
  • 使用CGPathCreateCopyByTransformingPath复制路径,将其从自身平移2.0 * bbox.width(注意:仅使用X方向,这样您无需担心上下文中的翻转)
  • 使用CGContextClipToRect
  • 将上下文剪辑到原始bbox
  • 使用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次更快,但不是绝对的。

这取决于实现这种效果对你有多大价值。