Image.FromFile上的内存不足

时间:2017-04-23 06:44:32

标签: c# image file windows-7 windows-10

我在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);
            }
        }
    }

我到了一个地方,我已经删除了使用中的所有内容并仍然崩溃。

2 个答案:

答案 0 :(得分:0)

根据MSDN

  

如果文件没有有效的图像格式,或者GDI +不支持文件的像素格式,则此方法会抛出OutOfMemoryException异常。

我认为不再支持您尝试加载的图像了。您可以上传示例图片以帮助我们重现图像。

图像的内部结构可能会混淆GDI +编码器。尝试使用图像编辑器打开故障图像并再次保存。现在尝试使用您的代码加载新图像。

答案 1 :(得分:0)

由于某种原因,观察者在文件第一次被解锁时触发,但下次文件仍然被写入,不完整,这使得OOM异常有意义

  

如果文件没有有效的图像格式,或者GDI +不支持文件的像素格式,则此方法会抛出OutOfMemoryException异常。

如果文件已解锁,我添加了一个检查每100毫秒的方法。

我刚注意到的其他事情,它在我复制文件时抛出异常,而不是在我移动它时抛出异常。