我正在使用在四台计算机上运行的C#.Net 4.5计算渲染服务中的字体指标,三台运行Windows 8.1,一台运行Server 2008 R2,所有这些都是最新的各种更新。
在服务代码中,我使用以下内容来获取一些字体指标:
int emHeight = font.FontFamily.GetEmHeight(font.Style);
int lineSpacing = font.FontFamily.GetLineSpacing(font.Style);
然后我使用这些值计算高度(以像素为单位),使用GDI + DrawString将一些文本渲染到位图。
我按如下方式设置图形选项:
gfx.PageUnit = GraphicsUnit.Pixel;
gfx.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
gfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
然而,报告的度量值不同,两台机器同意它是一个值,另外两个同意它是一个不同的值。
在机器1和机器2上,em高度报告为1000,在机器3和服务器(机器4)上报告为2048。
机器1和2的线高报告为1213,机器3和4报告为2371。
由此产生的高度分别为51和48,这些差异足以引起问题。
我一直在研究字体指标,看起来你可以在字体中指定每个em的字体设计单位,并且传统的值在Mac上为1000,最近在Windows上为2048,但是所有机器都使用相同的二进制文件字体文件。
有没有办法告诉字体使用我在代码中指定的设计单位而不是从操作系统中检索的任意值,或者是否有办法通过更改系统值使所有4台机器上的此值保持一致或注册表项?
我已经检查了可视DPI显示设置,它们在设备上与清除类型设置相同。我不确定其他任何设置会有什么帮助。
编辑 -
值是什么并不重要,只是它们在机器上报告不一致。
我正在使用Font和FontFamily类加载字体,并且我在所有机器上安装了相同的字体文件。
问题变得明显的字体是FranklinGothicNew,但它会影响许多字体,包括Eurasia,Greyhound和Lightfoot。
我写了一个快速检查程序,在每台机器上运行以突出显示差异。
foreach (var f in fontList) {
try {
var font = new Font(f, 10, FontStyle.Regular);
int emHeight = font.FontFamily.GetEmHeight(font.Style);
Console.WriteLine("{0}: {1}", f, emHeight);
}
catch {
Console.WriteLine("{0}: {1}", f, "unknown");
}
}