【发布时间】:2012-03-02 08:48:56
【问题描述】:
我注意到 Graphics.MeasureString 在不同分辨率下的奇怪行为。
对于默认分辨率 (96x96),我测试的不同字体大小之间存在线性关系。
但是,如果我将它提高到 512 x 512,线性关系就会消失,并且在使用度量字符串时会发生一些非常奇怪的事情。 (参见下面的 4 个图)
如果我将图形对象的分辨率保持在默认大小,并测量字体大小,这里是字体大小和字符串宽度之间的关系:
图形对象,默认分辨率 (96):
字体大小(X 轴),特定字符串的宽度(Y 轴)
字体大小(X 轴),特定字符串的高度(Y 轴)
但是,如果我改变分辨率
图形对象,512分辨率:
字体大小(X 轴),特定字符串的宽度(Y 轴)
字体大小(X 轴),特定字符串的高度(Y 轴)
有人知道为什么会这样吗?
谢谢。
应该注意我使用的是 .NET 4(完整配置文件)
用于生成图表的代码(更改每种类型的分辨率):
string str = "6 CN-3 Tie EomgVeo405- 2ss>era09rni IBne 20iopv Atdrsn - Ng72";
SizeF sizef = new SizeF(855, 14.000001f);
StringFormat stringFormat = new StringFormat()
{
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Near,
Trimming = StringTrimming.None,
FormatFlags = StringFormatFlags.NoClip,
};
Bitmap b = new Bitmap(901, 401);
//b.SetResolution(512, 512);
Graphics g = Graphics.FromImage(b);
for (float x = origFont.Size; x >= 0.5; x -= 0.1f)
{
var data = g.MeasureString(str, new Font("Microsoft Sans Serif", x), sizef, stringFormat);
Console.WriteLine(x + "\t" + data.Width + "\t" + data.Height);
}
【问题讨论】:
-
Graphics.MeasureString() 非常糟糕,在 .NET 版本 2 中被 TextRenderer.MeasureText() 取代。否则,您可以从 TrueType 提示算法中获得这种模式。以小于 8 的点或像素大小渲染文本否则毫无意义。
-
当宽度达到 850 时它开始“卡顿”。这是我输入 Graphics.MeasureString 的最大允许宽度。正如 Lasse V. Karlsen 指出的那样,该死的东西正在包装。我未能添加“不换行”标志。谢谢大家!
标签: c# .net graphics gdi+ resolution