确定文本宽度

5

我希望找到在C#中计算指定字体文本宽度的正确方法。以下是我在Java中使用的方法,似乎可以工作:

public static float textWidth(String text, Font font) {

    // define context used for determining glyph metrics.        
    BufferedImage bufImage = new BufferedImage(2 /* dummy */, 2 /* dummy */, BufferedImage.TYPE_4BYTE_ABGR_PRE);
    Graphics2D g2d = (Graphics2D) bufImage.createGraphics();
    FontRenderContext fontRenderContext = g2d.getFontRenderContext();

    // determine width
    Rectangle2D bounds = font.createGlyphVector(fontRenderContext, text).getLogicalBounds();
    return (float) bounds.getWidth();
}

但是请看我的C#代码:

public static float TextWidth(string text, Font f)
{
    // define context used for determining glyph metrics.        
    Bitmap bitmap = new Bitmap(1, 1);
    Graphics grfx = Graphics.FromImage(bitmap);

    // determine width         
    SizeF bounds = grfx.MeasureString(text, f);
    return bounds.Width;
}

对于相同的字体,以上两个函数给出不同的值。为什么呢?在我的情况下,正确的方法是什么?

更新:使用 TextRenderer.MeasureText 方法只能得到整数测量值。我需要更精确的结果。


Java和".Net"(C#,VB.NET等)使用不同的库。 - umlcat
2个回答

12

使用TextRenderer

Size size = TextRenderer.MeasureText( < with 6 overloads> );

TextRenderer.DrawText( < with 8 overloads> );

这篇MSDN杂志文章中有一篇介绍TextRenderer的好文章。


1
+1,而在Java中更好的方法是使用FontMetrics来确定一个字符串的宽度,使用stringWidth()函数。 - S22h
可能三种方法(FontRenderContext、MeasureString和TextRenderer)不仅会产生不同的宽度,而且还会稍微以不同的方式呈现文本。然而,测量结果很可能与相应的渲染方法一致。我认为正确的方法是使用相同的技术来测量和呈现。 - Olivier Jacot-Descombes

5

除了没有处理对象之外,没有什么特别突出的地方:

public static float TextWidth(string text, Font f) {
  float textWidth = 0;

  using (Bitmap bmp = new Bitmap(1,1))
  using (Graphics g = Graphics.FromImage(bmp)) {
    textWidth = g.MeasureString(text, f).Width;
  }

  return textWidth;
}

另一种尝试的方法是使用TextRenderer类:
return TextRenderer.MeasureText(text, f).Width;

但它返回的是整数,而不是浮点数。


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