我正在使用.NET Framework 4.0在Windows8.1 x64上运行一些关于字体的测试。然后问题出来...奇怪的异常“不支持风格'正常'”在GDI +
在系统中安装了约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'黑体'不支持style'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来测试一个字符串。
但spearatly运行它们,你会发现结果确实不同....
(注意,结果第二次是从编码1)
然后,我真的要问:为什么有些字体在代码1中报告支持,但在代码2中不支持常规支持?...
它发生了,我见过一个斜体字体的例子,它没有实现Regular样式,只有斜体。这很少见,但是如果你让这个代码在1500种字体上松动,那么你很容易找到一个:)字体映射器通常会提供一个替代品,很不清楚为什么它在一种情况下会出现,但不会出现在另一种情况下。一个内存问题将是一个疯狂的猜测,这些*不是*小字体。警惕免费软件字体,SimHei的盗版版本遍布互联网。 – 2014-10-11 12:38:15