2014-10-11 37 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