如何获取GraphicsPath绘制的描边文本的准确尺寸?
解决描边文本与普通文本尺寸不一致及准确测量问题
我开发了一个将PictureBox中位图作为文本对象的程序,目前除描边文本外,其他功能(包括自动换行)都已实现。
描边文本绘制代码
我通过GraphicsPath实现描边文本绘制:
private void DrawOutlineString(string text, PointF pos) { Graphics g = Graphics.FromImage(image); SolidBrush b = new(forecolor); Pen pen = new(outlinecolor, outlinesize); GraphicsPath gp = new(); gp.AddString(text, fontfamily, (int)fontstyle, g.DpiY * fontsize / 72, pos, new StringFormat()); g.DrawPath(pen, gp); g.FillPath(b, gp); gp.Dispose(); pen.Dispose(); b.Dispose(); g.Dispose(); }
该方法先创建包含字体信息的文本路径,再通过DrawPath(描边)和FillPath(填充)完成绘制,描边粗细由Pen的厚度决定。
遇到的问题
用上述方式绘制的文本,尺寸和DrawString绘制的普通文本不一致。我尝试给MeasureString的结果直接增加两倍描边宽度来计算描边文本尺寸,但完全无效:
private SizeF GetTextSize(string text) { Graphics g = Graphics.FromImage(image); SizeF size = g.MeasureString(text, font); g.Dispose(); return size; } private SizeF GetOutlineTextSize(string text) { SizeF size = GetTextSize(text); size.Width += outlinesize * 2; size.Height += outlinesize * 2; return size; }
问题原因
MeasureString仅计算文本字形本身的边界,而描边是沿字形路径向外扩展的。不同字形的边角、粗细变化会导致描边的实际扩展范围并非均匀的“原尺寸+两倍描边宽度”,简单加减必然产生误差。
正确的测量方法
通过GraphicsPath.GetBounds(null, pen)方法可以准确计算包含描边的文本尺寸——该方法会结合Pen的宽度,计算出路径(含描边)实际占据的边界。优化后的测量代码如下(建议用using自动释放资源,避免内存泄漏):
private SizeF GetOutlineTextSize(string text) { using (Graphics g = Graphics.FromImage(image)) using (Pen p = new Pen(outlinecolor, outlinesize)) using (GraphicsPath gp = new GraphicsPath()) { // 确保与DrawOutlineString使用完全一致的字体、字号、格式参数 gp.AddString(text, fontfamily, (int)fontstyle, g.DpiY * fontsize / 72, PointF.Empty, new StringFormat()); // 传入Pen参数,让GetBounds计算包含描边的完整边界 RectangleF rect = gp.GetBounds(null, p); return new SizeF(rect.Width, rect.Height); } }
注意:必须保证测量时使用的fontfamily、fontstyle、fontsize、StringFormat等参数和绘制描边文本时完全一致,否则尺寸计算仍会有偏差。
内容的提问来源于stack exchange,提问作者woodmage
相关产品推荐
相关产品推荐

