2012-03-15 77 views
4

我想找到正確的方法來計算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; 
} 

我對上述相同的字體兩種功能不同的值。爲什麼?在我的情況下,正確的方法是什麼?

UPDATE:本TextRenderer.MeasureText方法只給出整數測量。我需要更多的預告結果。

+0

Java和「.Net」(c#,VB.NET,else)使用不同的庫 – umlcat 2014-10-22 17:31:48

回答

8

使用TextRenderer

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

TextRenderer.DrawText(< with 8 overloads>); 

有一個在this MSDN Magazine articleTextRenderer的好文章。

+1

+1,在Java中,更好的方法是使用FontMetrics來確定帶有stringWidth()函數的String的寬度。 – SJFrK 2012-03-15 15:06:03

+0

@Olivier查看我的更新 – 2012-03-22 12:01:35

+0

可能三種方法(FontRenderContext,MeasureString和TextRenderer)不僅產生不同的寬度,而且使文本略有不同。然而,測量很可能與相應的渲染方法一致。我會說正確的方法是使用相同的技術進行測量和渲染。 – 2012-03-22 12:45:55

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,而不是浮動。