在GraphicsPath.AddString()中使用特定字体和字符的通用GDI+异常

本文关键字:字体 字符 异常 GDI+ AddString GraphicsPath | 更新日期: 2023-09-27 17:50:15

你知道为什么最近的Windows更新会导致GraphicsPath.AddString()和一些字体出现问题,但只针对特定字符吗?如何解决这个问题?

示例字体是细铅笔笔迹(它是公共领域,所以你可以自己尝试)。如果你用Graphics.DrawString(),它工作得很好。如果您尝试使用GraphicsPath.AddString()来写Lorem ipsum,它也可以正常工作,但如果您尝试使用C字符(大写c)或5数字,则会失败。

它在几周前工作得很好,在最近的更新之后,它悲惨地失败了,臭名昭著的和几乎不可调试的通用GDI+异常

示例代码:

string textOK = "Lorem ipsum";
string broken = "C"; // Yes, only capital letter 'c'!
FontStyle style = FontStyle.Regular;
Bitmap b = new Bitmap(200, 200, PixelFormat.Format32bppPArgb)
using (Graphics g = Graphics.FromImage(b))
{
  g.Clear(Color.White);
  g.SmoothingMode = SmoothingMode.HighQuality;
  using (StringFormat sf = new StringFormat())
  {
    RectangleF rect = new RectangleF(0, 0, 200, 200);
    float size = 8;
    using (Font f = new System.Drawing.Font("Thin Pencil Handwriting", size, style))
    {
      // Works perfectly fine
      g.DrawString(textOK, f, Brushes.Black, rect, sf);
      g.DrawString(broken, f, Brushes.Black, rect, sf);
    }
    using (GraphicsPath path = new GraphicsPath())
    {
      FontFamily family = new FontFamily("Thin Pencil Handwriting");
      // This works fine
      path.AddString(textOK, family, (int)style, size, rect, sf);
      // This causes Generic GDI+ exception!
      path.AddString(broken, family, (int)style, size, rect, sf);
      g.FillPath(Brushes.Black, path);
    }
  }
}

我正在使用c#,但我不认为它与c#特别相关。没有最新更新的旧机器工作得很好,但我不能告诉人们不要安装系统更新:(我还发现了另外两种导致类似问题的字体-都是GraphicsPath.AddString()方法。

在GraphicsPath.AddString()中使用特定字体和字符的通用GDI+异常

我今天早上安装更新后遇到了同样的问题。我发现微软最近的一篇文章似乎解决了这个问题,尽管这个问题似乎仍然很突出。

https://connect.microsoft.com/VisualStudio/feedback/details/1331855/kb3045171-crash-gdi-with-system-drawing-drawing2d-addstring