我正在使用.NET framework 4.0在Windows8.1 x64上运行一些关于字体的测试。然后问题就出来了......
在系统中安装了大约1000-1500个字体之后,我使用以下代码尝试获取所有字体并测试它们的渲染大小。
static void Test3()
{
var bitmap = new System.Drawing.Bitmap(500, 500, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
var g = System.Drawing.Graphics.FromImage(bitmap);
foreach (var f in FontFamily.Families)
{
try
{
Console.Write("test [" + f.Name + "] ...");
var fn = new System.Drawing.Font(f, 16.0f, System.Drawing.FontStyle.Regular);
g.MeasureString("test TEST 测试 测试測試 測試 繁體 簡體 楷體 繁体 简体 楷体", fn);
Console.WriteLine("[OK]");
}
catch (Exception ex)
{
Console.WriteLine("[ERR] " + ex.Message);
}
}
}
但遗憾的是,这段代码无法正常运行。它将显示许多这样的ERR:
注意带红色边框的行。它说Font'黑体'不支持'Regular'风格。
现在考虑以下代码:
static void Test2()
{
var bitmap = new System.Drawing.Bitmap(500, 500, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
var g = System.Drawing.Graphics.FromImage(bitmap);
foreach (var f in FontFamily.Families.Where(s => s.Name == "黑体"))
{
try
{
Console.Write("test [" + f.Name + "] ...");
var fn = new System.Drawing.Font(f, 16.0f, System.Drawing.FontStyle.Regular);
g.MeasureString("test TEST 测试 测试測試 測試 繁體 簡體 楷體 繁体 简体 楷体", fn);
Console.WriteLine("[OK]");
}
catch (Exception ex)
{
Console.WriteLine("[ERR] " + ex.Message);
}
}
}
它只是忽略所有其他字体,但只测试'黑体'。这是结果:
....现在我完全糊涂了。谁有人解释原因? 感谢。
请考虑以下代码段:
[代码1]
var bitmap = new System.Drawing.Bitmap(500, 500, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
var g = System.Drawing.Graphics.FromImage(bitmap);
var fam = FontFamily.Families;
var dic1 = fam.ToDictionary(s => s.Name, s => s.IsStyleAvailable(FontStyle.Regular));
Console.WriteLine(dic1.Values.Count(s => s));
[代码2]
var bitmap = new System.Drawing.Bitmap(500, 500, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
var g = System.Drawing.Graphics.FromImage(bitmap);
var fam = FontFamily.Families;
var dic2 = fam.ToDictionary(s => s.Name, s =>
{
var b = s.IsStyleAvailable(FontStyle.Regular);
if (b)
{
var fn = new System.Drawing.Font(s, 16.0f, System.Drawing.FontStyle.Regular);
try
{
g.MeasureString(s.Name, fn);
}
catch (Exception ex)
{
Console.WriteLine(s.Name + " -> Failed -> " + ex.Message);
}
fn.Dispose();
}
else
{
Console.WriteLine(s.Name + " -> NOT SUPPORT.");
}
return b;
});
Console.WriteLine(dic2.Values.Count(s => s));
他们都要计算支持Regular的字体。唯一的区别在于第二个代码片段,如果它支持Regular,我们使用MesureString来测试字符串。
但是按照惯例运行它们,你会注意到结果真的不同......
(注意结果第二个来自code1)
然后我真的想问:为什么有些字体在code1中报告了常规SUPPORT但在代码2中没有支持常规?...
答案 0 :(得分:0)
之前相同的字体是否有效?我记得一个熟人遇到了类似的事情并抛出了异常,因为字体不支持特定的样式。 您还可以阅读this answer,它以更具技术性的方式解释您的问题。