FileModeWinding和DrawPath会导致奇数峰值出现

时间:2010-09-21 17:17:43

标签: gdi+

我正在使用gdiplus来“抚制”一个短信。在某些情况下,我们看到图形的顶部或底部出现“尖峰”,我不确定为什么。我们可以通过调整笔划宽度和字体大小来最小化这个,但这不是一个好的解决方案。我希望有人能向我解释这个问题。

Spikey Bug

代码示例生成此4,其轮廓和尖峰(无意)

GraphicsPath path(FillModeWinding);   

      path.AddString(text,wcslen(text),&fontFamily,StateInfo.TheFont.TheWeight,(REAL)minSize,PointF((REAL)ptStart.x, (REAL)ptStart.y),&sf);
      // Draw the outline first
      if (StateInfo.StrokeWidth > 0) {
        Gdiplus::Color strokecolor(GetRValue(StateInfo.StrokeColor), GetGValue(StateInfo.StrokeColor), GetBValue(StateInfo.StrokeColor));
        Pen pen(strokecolor,(REAL)StateInfo.StrokeWidth);      
        graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias);
        graphics.SetPixelOffsetMode(Gdiplus::PixelOffsetModeHighQuality);
        graphics.DrawPath(&pen, &path);
        }
      // Draw the text by filling the path        
      graphics.FillPath(&solidBrush, &path);

2 个答案:

答案 0 :(得分:7)

在您用于绘制轮廓的笔上使用Pen::SetLineJoin,并使用LineJoinMiter以外的其他内容。

答案 1 :(得分:3)

我同意填充模式不是问题,我认为它只是用于绘制轮廓的笔宽度。对于具有尖角(如4和'A')的封闭空格的字符,随着用于绘制轮廓的笔宽度变大,内部形状的大小(在四个情况下的小三角形)也变大。

最终内部形状会变得太大而无法被外部形状所包含,并且会开始刺穿,导致你看到的神器。

以下是轮廓宽度变大时固定字体大小(Impact字体)的图示。这里没有填充,只是调用graphics.DrawPath():

alt text

填充操作不关心轮廓宽度,而是使用字母的原始形状。

通过掩盖一些凌乱的轮廓,这部分地掩盖了这个问题。这是打开填充:

alt text

字符'A'会发生类似的事情:

alt text alt text

编辑:如另一个答案中所示,调用SetLineJoin是阻止这种情况发生的方法。