【问题标题】:Out of memory on Image.FromFileImage.FromFile 内存不足
【发布时间】:2017-04-23 06:44:32
【问题描述】:

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

我已经删除了 using 中的所有内容,但仍然崩溃。

【问题讨论】:

  • 您是否尝试将位图写入您从中读取它的同一文件中?这不应该奏效!使用流!
  • 我什么时候写图像?你的意思是轮换还是保存?无论如何,我删除了 using 中的所有代码,仍然抛出异常。
  • 嗯,是只有一张图片还是还有更多?你能告诉我们更多关于他们的信息吗?
  • 这是其中一张图片。 imgur.com/a/LCt0e。它发生在 jpg 和 png 中。
  • 好吧,图片是无辜的。以下是我的怀疑,但无法测试是否缺少时间: Filewatcher 的触发速度超过每秒一次,因此文件名并不总是不同,因此出现了覆盖正在使用的文件的老问题。可以吗?搜索有关覆盖文件的帖子,您会看到很多示例。一种方法是使用流进行 IO..

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


【解决方案1】:

根据MSDN

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

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

也许图像的内部结构混淆了 GDI+ 编码器。尝试使用图像编辑器打开错误图像并再次保存。现在尝试使用您的代码加载新图像。

【讨论】:

  • 能否上传一张导致OOM异常的图片供我们测试。
【解决方案2】:

由于某种原因,watcher 第一次在文件已经解锁时触发,但下一次文件仍在写入,不完整,这使得 OOM 异常变得有意义

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-08
    • 2019-07-31
    • 1970-01-01
    • 2014-10-15
    • 2011-05-21
    • 2021-12-20
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多