2014-10-11 65 views
0

我正在使用.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这样的:

ERROR SHOWN

通知与红色边框行。它说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运行它们,你会发现结果确实不同....

two results

(注意,结果第二次是从编码1)

然后,我真的要问:为什么有些字体在代码1中报告支持,但在代码2中不支持常规支持?...

+0

它发生了,我见过一个斜体字体的例子,它没有实现Regular样式,只有斜体。这很少见,但是如果你让这个代码在1500种字体上松动,那么你很容易找到一个:)字体映射器通常会提供一个替代品,很不清楚为什么它在一种情况下会出现,但不会出现在另一种情况下。一个内存问题将是一个疯狂的猜测,这些*不是*小字体。警惕免费软件字体,SimHei的盗版版本遍布互联网。 – 2014-10-11 12:38:15

回答

0

以前是否使用过相同的字体?我记得有一位熟人遇到类似的情况,因为字体不支持特定的样式,所以抛出异常。 您也可以阅读this answer,它以更技术性的方式解释您的问题。

+0

这种字体效果很好。问题是为什么这种字体样式** SUPPORT **最初是规则的,但是在下一段代码中不支持** ** ** SUPPORT **。在这个问题中,** f.IsStyleAvailable(FontStyle。常规)**将在Test3()**中返回** TRUE **,而在Test2()中返回** FALSE **。 – cFish 2014-10-11 10:35:43

+0

uhhm ....我假设's'是硬编码的位置字体,是吧? test2可能正在工作,因为您在循环定义中使用's'而不是'f'。也。 尝试使用FontFamily.Families.Where(f.IsStyleAvailable.Regular)运行test2 – Zero 2014-10-11 11:19:48

+0

没有错误,但许多字体消失。消失的字体可以单独使用,没有任何问题。 – cFish 2014-10-11 11:42:53