C# Image.from文件内存不足

C# Image.from文件内存不足,c#,image,file,windows-7,windows-10,C#,Image,File,Windows 7,Windows 10,我在Windows7上写了一个程序,从文件夹中的图像中读取二维码,效果很好,但现在我在Windows10上尝试,结果崩溃了。 我正在使用Image.FromFile读取文件。第一次似乎工作正常,但第二次抛出内存不足异常 代码如下: private void watcher_FileCreated(object sender, FileSystemEventArgs e) { string strFileExt = Path.GetExtension(e.FullPath)

我在Windows7上写了一个程序,从文件夹中的图像中读取二维码,效果很好,但现在我在Windows10上尝试,结果崩溃了。 我正在使用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);
            }
        }
    }
我已经把电脑里的所有东西都拿走了,但还是死机了

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

我认为您尝试加载的图像不再受支持。你能上传一张示例图片来帮助我们重现图像吗


也许图像的内部结构混淆了GDI+编码器。尝试使用图像编辑器打开有故障的图像,然后再次保存。现在尝试使用代码加载新图像

出于某种原因,当文件已解锁时,观察者第一次触发,但下一次文件仍在写入中,不完整,这使得OOM异常作为

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

我添加了一种方法,每100毫秒检查一次文件是否解锁


我刚刚注意到的另一件事是,当我复制文件而不是移动文件时,它会引发异常。

是否尝试将位图写入读取位图的同一文件?这本不该奏效的!使用一条小溪!我什么时候写这个图像?你是说轮换还是保存?不管怎样,我删除了using中的所有代码,仍然抛出了异常。嗯,这只是一个图像还是更多的图像?你能告诉我们更多关于他们的情况吗?这是其中一张图片。它发生在jpg和png上。好的,图像是无辜的。以下是我所怀疑的,但由于时间不够,无法测试:Filewatcher每秒启动一次以上,因此文件名并不总是不同的,因此出现了覆盖正在使用的文件的旧问题。可能是这样吗?搜索关于覆盖文件的帖子,你会看到很多例子。一种方法是用流进行IO。你能上传一个导致OOM异常的图像供我们测试吗。