如何解决此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;
}
答案 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。我会删除那一行。
我不认为这是你的例外的原因。
编辑:
您的代码不会给我带来错误。这是图像本身的问题(你尝试过另一个图像吗?)或者你想要保存到的路径有问题(你试过将另一个文件保存到同一路径吗?)。