我正在使用gdiplus来“抚制”一个短信。在某些情况下,我们看到图形的顶部或底部出现“尖峰”,我不确定为什么。我们可以通过调整笔划宽度和字体大小来最小化这个,但这不是一个好的解决方案。我希望有人能向我解释这个问题。
代码示例生成此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);
答案 0 :(得分:7)
在您用于绘制轮廓的笔上使用Pen::SetLineJoin,并使用LineJoinMiter以外的其他内容。
答案 1 :(得分:3)
我同意填充模式不是问题,我认为它只是用于绘制轮廓的笔宽度。对于具有尖角(如4和'A')的封闭空格的字符,随着用于绘制轮廓的笔宽度变大,内部形状的大小(在四个情况下的小三角形)也变大。
最终内部形状会变得太大而无法被外部形状所包含,并且会开始刺穿,导致你看到的神器。
以下是轮廓宽度变大时固定字体大小(Impact字体)的图示。这里没有填充,只是调用graphics.DrawPath():
填充操作不关心轮廓宽度,而是使用字母的原始形状。
通过掩盖一些凌乱的轮廓,这部分地掩盖了这个问题。这是打开填充:
字符'A'会发生类似的事情:
编辑:如另一个答案中所示,调用SetLineJoin
是阻止这种情况发生的方法。