奇怪的例外"不支持风格'常规#39;和#34;在GDI +上

时间:2014-10-11 10:13:25

标签: .net fonts gdi+

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

ERROR SHOWN

注意带红色边框的行。它说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来测试字符串。

但是按照惯例运行它们,你会注意到结果真的不同......

two results

(注意结果第二个来自code1)

然后我真的想问:为什么有些字体在code1中报告了常规SUPPORT但在代码2中没有支持常规?...

1 个答案:

答案 0 :(得分:0)

之前相同的字体是否有效?我记得一个熟人遇到了类似的事情并抛出了异常,因为字体不支持特定的样式。 您还可以阅读this answer,它以更具技术性的方式解释您的问题。