iOS Quartz/CoreGraphics绘制羽毛笔画
我正在绘制一个路径到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)];
我要继续前进,假设你的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次路径要快,但绝不是如此。
它会降低多少实现这种效果值得你。
你有没有试过CGContextSetShouldAntialias函数? – Davyd
在过去,我有类似的问题使用四条曲线或2个控制点的曲线。如果你发给我你想绘制的.svg或者至少是你想要绘制的羽毛的更多信息,我可以帮忙 – GianPac