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

时间:2014-03-28 08:59:20

标签: c# asp.net .net image gdi+

例外:

  

GDI +中发生了一般错误。    在System.Drawing.Image.Save(String filename,ImageCodecInfo encoder,EncoderParameters encoderParams)    在System.Drawing.Image.Save(String filename,ImageFormat格式)    在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);

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

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

==>垃圾收集器问题?

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

6 个答案:

答案 0 :(得分:23)

从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);
      }
  }

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

gdi+ error saving image from webpage

When drawing an image: System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI

答案 1 :(得分:7)

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

答案 2 :(得分:2)

保存图片时遇到了同样的异常消息。事实证明我的代码很好并且做了应该做的事情。

问题是硬盘驱动器已满,因此无法创建新映像。我在尝试保存我正在处理的项目时才注意到这一点,因为它没有空间可以保存。

答案 3 :(得分:2)

在我的情况下,下面的代码段工作正常,其中 ConvertedImageString 是从API接收的Base64Image字符串,我将其转换为具有格式的相关图像,并将其保存到服务器上的物理文件文件夹。 / p>

修改:发生上述错误可能是因为您尝试保存图片的文件路径错误

string converted = ConvertedImageString.Replace('-', '+');
converted = converted.Replace('_', '/');
using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(ConvertedImageString)))
{
    using (Bitmap bm1 = new Bitmap(ms))
    {
        newFileName =  id + ".jpg";
        newFileName = CleanFileName(newFileName);
        newFileName = newFileName.Replace(" ", "_");

        Path = Path + newFileName;

        bm1.Save(Path, ImageFormat.Jpeg);
    }
}

答案 4 :(得分:0)

当您调用“ Image.FromFile”或“ Image.Save”时,图像对象将在文件上保持锁定,直到将其明确处置为止。如果您对同一文件名执行另一个“ Image.Save”或“ Image.FromFile”,则可能会出现“通用错误”异常。这取决于垃圾收集器是否已处理图像,因此结果不一致。

如果在“保存”操作后不需要该图像,则应立即将其丢弃。如果确实需要该图像,则Image.Clone将创建一个副本,该副本在源文件上没有锁定。

我在图像库编辑应用程序中遇到了这个问题,这是一个解决方案。

答案 5 :(得分:0)

此错误是由于图像已被使用。无论您在何处使用图像,都将图像转换为字符串 base 64 格式并使用它。这将解决错误。