我在4 - 5年前在互联网上看过一些帖子(一个来自StackOverflow,见here),但没有解决方案,Mono的GitHub回购的更改日志中没有任何内容,也没有其他提及这个的。我们的代码在.Net Framework下的Windows上运行正常,但在Mono 3.2.8下的Ubuntu 14.04.1上无法正常运行。
我编译了一个简单的控制台应用程序来说明问题。如果我们使用AddFontFile()或AddMemoryFont()将TTF数据加载到PrivateFontCollection中,我们可以整天实例化返回正确Name的Font对象,但是当尝试在Graphics.MeasureString()或Graphics.DrawString()或Graphics.MeasureCharacterRanges(),看起来Font已经回归到Ubuntu系统默认字体“DejaVu Sans”。
说明问题的代码在这里:
Dim pfc As New System.Drawing.Text.PrivateFontCollection
pfc.AddFontFile("Open Sans Condensed Bold.ttf")
Using f As New System.Drawing.Font(pfc.Families(0), 16)
Using img As New System.Drawing.Bitmap(100, 500)
Using g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(img)
g.Clear(Drawing.Color.White)
g.DrawString(f.Name, f, Drawing.Brushes.Black, 0, 0)
End Using
img.Save("testfont.png", System.Drawing.Imaging.ImageFormat.Png)
End Using
End Using
除了在运行代码的系统上安装字体之外,是否有可用的解决方法(顺便说一句,即使执行上面的代码而不是按名称实例化Font,这也让我相信问题实际上可能在于libgdiplus,因为它使用了fontconfig)。
之前还有其他人遇到过这个吗?无论我尝试什么TrueType文件,如果没有在系统上安装字体,这将无法正常工作。