[.NET]如何計算字串的高度及寬度

同事詢問要如何知道字串的寬度。
我們可以使用 Graphics.MeasureString 來計算,
但為什麼算出來的會比實際的還寬呢?

查看網路上 GDI+ 預設會為每個顯示的字加上 (1/6 em),

所以算出來就會比實際值還大。

所以我們可以多設定 StringFormat.GenericTypographic 就可以取到實際的 Width 。

string s = "To. ";
using (var image = new Bitmap(1, 1))
{
	using (var g = Graphics.FromImage(image))
	{
		//單位
		g.PageUnit = GraphicsUnit.Millimeter;
		g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
		//font
		Font f = new Font("Times New Roman", 14, FontStyle.Regular);
		var romanSize = g.MeasureString(s, f, int.MaxValue, StringFormat.GenericTypographic);
		Console.WriteLine($"Times New Roman Height:{romanSize.Height}, Width:{romanSize.Width}");
		f = new Font("標楷體", 14, FontStyle.Regular);
		var kaiuSize = g.MeasureString(s, f, int.MaxValue, StringFormat.GenericTypographic);
		Console.WriteLine($"標楷體 Height:{kaiuSize.Height}, Width:{kaiuSize.Width}");
	}
}
Console.ReadLine();

參考資料

Why is Graphics.MeasureString() returning a higher than expected number?

Measure a String without using a Graphics object?

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^