iOS Quartz/CoreGraphics绘制羽化笔画

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)];

你尝试过CGContextSetShouldAntialias函数吗? - Davyd Geyl
我以前在使用四次曲线或带有2个控制点的曲线时遇到过类似的问题。如果您将要绘制的 .svg 发送给我,或者至少提供一些关于您尝试绘制的羽毛的更多信息,我可能可以提供帮助。 - GianPac
1个回答

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,因此实际上,您将设置偏移.width为-2.0 * bbox.width或-4.0 * bbox.width) 您选择的颜色。 描边翻译出去的路径。 弹出GState:CGContextRestoreGState 这应该只留下“阴影”,您可以希望调整以实现所需的结果。
话虽如此,IME,CG的阴影绘制性能不完全令人满意,并且不完全确定。我期望它比用5个不同的笔画描边路径要快,但并不特别快。

这将取决于实现此效果对您来说有多重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接