7

我正在按照从用户那里收集的一组点绘制一条到 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)];
4

1 回答 1

2

我将继续假设您的 CGContext 仍然打开了抗锯齿功能,但如果没有,那么这是显而易见的第一个尝试,正如@Davyd 的评论所暗示的那样:CGContextSetShouldAntialias是感兴趣的功能。

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

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

另一个可能不太明显的选择可能是为此目的滥用 CG 的阴影绘制。您要查找的功能是:CGContextSetShadowWithColor 方法如下:

  • 保存 GState:CGContextSaveGState
  • 获取原始路径的边界框
  • 复制路径,将其从自身平移 2.0 * bbox.width 使用CGPathCreateCopyByTransformingPath(注意:仅使用 X 方向,这样您就不必担心上下文中的翻转)
  • 将上下文剪辑到原始 bbox 使用CGContextClipToRect
  • 在上下文中设置阴影CGContextSetShadowWithColor
    • 一些最小模糊(从 0.5 开始并从那里开始。模糊参数是非线性的,而 IME 是一种猜测和检查操作)
    • 等于 -2.0 * bbox 宽度和 0.0 高度的偏移量,缩放到基本空间。(注意:这些偏移量在基本空间中。这将是令人抓狂的,但假设您没有添加自己的比例变换,比例因子将是 1.0 或 2.0,所以实际上,您将设置-2.0*bbox.width 或 -4.0*bbox.width 的 offset.width)
    • 您选择的颜色。
  • 描边平移的路径。
  • 弹出 GStateCGContextRestoreGState

这应该会给您留下“只是”阴影,您可以希望对其进行调整以达到您想要的结果。

综上所述,CG 的阴影绘制性能与 IME 相比,还没有完全令人敬畏,也没有完全确定。我希望它比用 5 次不同的笔划在路径上划 5 次要快,但并非如此。

这将归结为实现这种效果对您来说价值多少。

于 2012-02-08T13:49:06.957 回答