Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# GDI+;中发生一般性错误;在System.Drawing.Image.Save中_C#_Asp.net_.net_Image_Gdi+ - Fatal编程技术网

C# GDI+;中发生一般性错误;在System.Drawing.Image.Save中

C# GDI+;中发生一般性错误;在System.Drawing.Image.Save中,c#,asp.net,.net,image,gdi+,C#,Asp.net,.net,Image,Gdi+,例外情况: GDI+中发生一般错误。 在System.Drawing.Image.Save(字符串文件名、ImageCodeInfo编码器、EncoderParameters encoderParams) 位于System.Drawing.Image.Save(字符串文件名,图像格式) 在System.Drawing.Image.Save(字符串文件名) 代码: 我们将base64字符串转换为MemoryStream,然后创建System.Drawing.Image(Image.FromStre

例外情况:

GDI+中发生一般错误。 在System.Drawing.Image.Save(字符串文件名、ImageCodeInfo编码器、EncoderParameters encoderParams) 位于System.Drawing.Image.Save(字符串文件名,图像格式) 在System.Drawing.Image.Save(字符串文件名)

代码:

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

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

==>垃圾收集器问题


我已经检查了临时文件夹的权限

从流中加载图像时,必须在图像的生命周期内保持流打开,请参见此

我认为这个异常是因为内存流在图像被处理之前就被关闭了。您可以按如下方式更改代码:

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

  using (var streamBitmap = new MemoryStream(bitmapData))
  {
      using (img = Image.FromStream(streamBitmap))
      { 
         img.Save(path);
      }
  }
以下是讨论类似问题的线程的一些链接:


我在保存图像时遇到了相同的异常消息。结果证明我的代码很好,并且做了它应该做的事情


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

请确保指定的路径有效。如果文件路径不存在,使用前面的答案(内存流上的usings),您仍然可能会得到这个确切的错误“Generic error in GDI+”。将创建文件,目录路径必须存在。

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

编辑:发生上述错误的原因可能是您试图保存图像的文件路径错误

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);
    }
}
当您调用“Image.FromFile”或“Image.Save”时,图像对象将保持对文件的锁定,直到文件被显式释放。如果对同一文件名执行另一个“Image.Save”或“Image.FromFile”,可能会出现“generic error”异常。这取决于垃圾收集器是否已处理映像,因此结果不一致

如果在“保存”操作后不需要该图像,则应立即将其处置。如果确实需要该映像,image.Clone将创建一个不锁定源文件的副本


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

此错误是由于图像已在使用。无论在何处使用图像,请将图像转换为string base 64格式并使用它。这将解决错误。

很好,谢谢!我将实施此更改并进行进一步测试。添加此评论是因为有人删除了与此已接受答案相关的我的补充答案。如果您看到GDI错误是在一段时间后抛出的,下面是如何确认导致异常的GDI内存泄漏。程序泄漏10000个句柄后,Windows将不再提供。您可以使用TaskMgr.exe诊断此类泄漏单击“进程”选项卡右键单击列并选择列以添加GDI对象的列。如果GDI对象是一个稳定增长的对象-那么您就有GDI内存泄漏。在我的情况下,结果是我的IIS应用程序池用户没有对该目录的写入权限。我只是想在这里补充一下,因为这个答案是一个类似的问题。如何在2015年使硬盘驱动器充满?在上面的代码中,我将图像作为图像的
BASE64ConvertedString
,并以“联合摄影专家组”的格式存储在IIS目录或网站目录中。对了,把这个写进你的答案里!这个真的帮助了我。在我的例子中,同样的错误是由于错误的路径引起的。非常感谢。
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);
    }
}