System.Drawing.Image.Save中的GDI +发生了一般错误

Raz*_*zor 22 .net c# asp.net gdi+ image

例外:

GDI +中发生了一般错误.System.Drawing.Image.Save(String filename)的System.Drawing.Image.Save(String filename,ImageCodecInfo encoder,EncoderParameters encoderParams)at System.Drawing.Image.Save(String filename,ImageFormat format)at System.Drawing.Image.Save(String filename)

码:

byte[] bitmapData = new byte[imageText.Length];
MemoryStream streamBitmap;
bitmapData = Convert.FromBase64String(imageText);
streamBitmap = new MemoryStream(bitmapData);
System.Drawing.Image img = Image.FromStream(streamBitmap);
img.Save(path);
Run Code Online (Sandbox Code Playgroud)

我们将base64字符串转换为MemoryStream,然后创建System.Drawing.Image(Image.FromStream(streamBitmap)).最后,图像保存在临时文件中.

奇怪的是,当Web服务器上的活动(并发用户数)很高并且问题在IISRESET或应用程序池回收后暂时解决时,问题似乎发生了......

==>垃圾收集器问题?

我已经检查了TEMP文件夹的权限......

Sur*_*amy 25

从Stream加载图像时,必须在图像的生命周期内保持流打开,请参阅MSDN Image.FromStream.

我认为异常是由于内存流甚至在图像处理之前就关闭了.您可以像这样更改代码

byte[] bitmapData = new byte[imageText.Length];
bitmapData = Convert.FromBase64String(imageText);

  using (var streamBitmap = new MemoryStream(bitmapData)
  {
      using (img = Image.FromStream(streamBitmap))
      { 
         img.Save(path);
      }
  }
Run Code Online (Sandbox Code Playgroud)

以下是一些讨论类似问题的线程的链接

gdi +错误从网页保存图像

绘制图像时:System.Runtime.InteropServices.ExternalException:GDI中发生一般错误

  • 添加此评论是因为有人删除了我与此已接受答案相关的补充答案。如果您看到 GDI 错误在一段时间后被抛出,这里是如何确认它正在泄漏导致异常的 GDI 内存。在程序泄漏 10,000 个句柄后,Windows 将不再提供它。您可以使用 TaskMgr.exe 诊断此类泄漏 单击进程选项卡右键单击列并选择列以添加 GDI 对象的列。如果 GDI 对象是一个稳步增加的对象 - 那么你就有了 GDI 内存泄漏。 (3认同)

小智 8

确保您指定的路径有效.使用前面的答案(使用内存流上的使用),如果文件路径不存在,您仍可能会收到"GDI +中的通用错误"这一确切错误.将创建该文件,目录路径必须存在.

  • 这对我真的很有帮助。就我而言,由于路径错误而引发了同样的错误。谢谢。 (2认同)