保存图像时如何修复此GDI +通用异常?

时间:2013-11-15 21:19:56

标签: c# exception bitmap gdi+

如何解决此GDI一般异常?

以下是例外:

System.Runtime.InteropServices.ExternalException was unhandled
HResult=-2147467259
Message=A generic error occurred in GDI+.
Source=System.Drawing
ErrorCode=-2147467259

代码:

public Bitmap resize(string FileName)
{
  string[] settings;
  string inputFolder = "";
  string qrFolder = "";
  string generalFolder = "";
  string archiveFolder = "";
  string resizedArchiveFolder ="";
  string line;
  int index = 0;
  settings = System.IO.File.ReadAllLines("config.txt");

  foreach (string setting in settings)
  {//access to config file info
    var arr = setting.Split('=');
    if (index == 0)
      inputFolder = arr[1];
    else if (index == 1)
      qrFolder = arr[1];
    else if (index == 2)
      generalFolder = arr[1];
    else if (index == 3)
      resizedArchiveFolder = arr[1];
    else
      archiveFolder = arr[1];

    index++;
  }

  string targetPath = resizedArchiveFolder;
  if (!System.IO.Directory.Exists(targetPath))
  {
    System.IO.Directory.CreateDirectory(targetPath);
  }

  Bitmap a2 = (Bitmap)Image.FromFile(FileName);

  //load file
  a2 = new Bitmap(a2, new Size(a2.Width * 3 / 2, a2.Height * 3 / 2));
  a2.SetResolution(1920, 1080);
  a2.Save(resizedArchiveFolder + System.IO.Path.GetFileName(FileName)); 

  // it throws here when I save
  return a2;
}

3 个答案:

答案 0 :(得分:3)

加载位图会锁定文件。尝试将另一个图像保存到同一文件将失败,并出现此异常。你需要正确地做到这一点,处理位图是一项艰难的要求:

  Bitmap newa2 = null;
  using (var a2 = (Bitmap)Image.FromFile(FileName)) {
      newa2 = new Bitmap(a2, new Size(a2.Width * 3 / 2, a2.Height * 3 / 2));
      newa2.SetResolution(1920, 1080);
  }
  newa2.Save(Path.Combine(resizedArchiveFolder, Path.GetFileName(FileName))); 
  return newa2;

using 语句可确保处理位图并且不再锁定文件。 SetResolution()参数是无意义的btw。

如果您仍然遇到问题,那么程序中某处的另一条(不可见)代码行会使用 resizedArchiveFolder 中的位图。它可能存在于另一个程序中,如图像查看器。

答案 1 :(得分:1)

我之前遇到过类似的问题。也许适合我的解决方案对你有用吗?

我的问题是Bitmap对象是“正在使用”,虽然我得到的是你收到的完全相同的异常......只是一般的例外。

所以在保存之前我创建了一个新的Bitmap对象Bitmap saveBitmap = new Bitmap(theBitmapYouwereTryingToSaveBefore);(传递你一直在那里工作的位图......)而只是在这个新对象上调用了Save()

答案 2 :(得分:0)

  

a2.SetResolution(1920,1080);

这是一个问题。您应该阅读此功能的documentation。这肯定不是你的想法。

您认为它是图像的尺寸,但它实际上是图像的DPI。标准DPI为90. DPI用于定义实际测量中图像的实际尺寸。

在这种情况下,您无需设置DPI。我会删除那一行。

我不认为这是你的例外的原因。

编辑:

您的代码不会给我带来错误。这是图像本身的问题(你尝试过另一个图像吗?)或者你想要保存到的路径有问题(你试过将另一个文件保存到同一路径吗?)。