我在Windows 7上写了一个程序,用于从放在文件夹中的图像中读取QR码并且工作正常,但现在我在Windows 10上尝试它并崩溃了。 我正在使用Image.FromFile来读取文件。它似乎第一次工作正常,但第二次它会抛出一个内存不足的例外。
以下是代码:
private void watcher_FileCreated(object sender, FileSystemEventArgs e)
{
string strFileExt = Path.GetExtension(e.FullPath);
if (Regex.IsMatch(strFileExt, @"\.jpg|\.png", RegexOptions.IgnoreCase))
{
try
{
using (var b = (Bitmap)Image.FromFile(e.FullPath))
{
var result = reader.Decode(b);
if (result != null)
{
if (result.ResultPoints[0].X < result.ResultPoints[2].X)
{
if (result.ResultPoints[0].Y < result.ResultPoints[2].Y)
{
b.RotateFlip(System.Drawing.RotateFlipType.Rotate270FlipNone);
}
}
else
{
if (result.ResultPoints[0].Y < result.ResultPoints[2].Y)
{
b.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
}
else
{
b.RotateFlip(System.Drawing.RotateFlipType.Rotate90FlipNone);
}
}
string fileName = result.Text + DateTime.Now.ToString("yyyyMMdd-HHmmss") + Path.GetExtension(e.FullPath);
b.Save(Path.Combine(ConfigurationManager.AppSettings["destinationFolder"], fileName));
client.SendData(result.Text + "|" + fileName, "qrListener");
Console.WriteLine("QR: " + result.Text + " File: " + fileName);
}
}
File.Delete(e.FullPath);
}
catch (Exception ex){
Console.WriteLine(ex.Message);
}
}
}
我到了一个地方,我已经删除了使用中的所有内容并仍然崩溃。
答案 0 :(得分:0)
根据MSDN
如果文件没有有效的图像格式,或者GDI +不支持文件的像素格式,则此方法会抛出OutOfMemoryException异常。
我认为不再支持您尝试加载的图像了。您可以上传示例图片以帮助我们重现图像。
图像的内部结构可能会混淆GDI +编码器。尝试使用图像编辑器打开故障图像并再次保存。现在尝试使用您的代码加载新图像。
答案 1 :(得分:0)
由于某种原因,观察者在文件第一次被解锁时触发,但下次文件仍然被写入,不完整,这使得OOM异常有意义
如果文件没有有效的图像格式,或者GDI +不支持文件的像素格式,则此方法会抛出OutOfMemoryException异常。
如果文件已解锁,我添加了一个检查每100毫秒的方法。
我刚注意到的其他事情,它在我复制文件时抛出异常,而不是在我移动它时抛出异常。