确定文本宽度

时间:2012-03-15 14:57:50

标签: c# java

我想找到正确的方法来计算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 方法仅提供整数测量值。我需要更多的前期结果。

2 个答案:

答案 0 :(得分:8)

使用TextRenderer

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

TextRenderer.DrawText( < with 8 overloads> );

this MSDN Magazine articleTextRenderer上有一篇很好的文章。

答案 1 :(得分:2)

除了没有处理你的物品外,没有什么是突出的:

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;

但它返回一个int,而不是一个浮点数。