我正在使用.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