System.Drawing.Image.FromFile()上的Out of Memory异常

doo*_*urt 41 asp.net image bitmap

我有一个图像上传器和裁剪器,它创建缩略图,我偶尔会在以下行中获得Out Of Memory异常:

Dim bm As Bitmap = System.Drawing.Image.FromFile(imageFile)
Run Code Online (Sandbox Code Playgroud)

错误的发生是微小的,非常罕见,但我总是想知道可能导致它的原因.imageFile变量只是一个Server.MapPath到图像的路径.

我很好奇,如果有人以前遇到过这个问题,他们是否有任何想法可能导致它?这可能是图像的大小吗?

我可以在必要时发布代码以及我所拥有的任何支持信息,但是我很乐意听到人们对此的看法.

Jon*_*eet 41

这是值得了解OutOfMemoryException异常并不总是真的意味着它的内存不足-特别是不与文件打交道时.我相信如果你出于某种原因用完手柄也会发生这种情况.

你完成它们之后是否处理了所有的位图?对于单个图像,这是否会重复发生?

  • 你是如何确定图像已损坏的?在执行Image.FromFile时,我也遇到了这些OutOfMemoryException错误.奇怪的是,它只会将异常抛出到一台服务器上,而不是另一台服务器上.我可以错过一些必要的编码器吗?这是从Getty图像下载的4256x2832 24bpp sRGB JPEG. (9认同)
  • 我怀疑它可能不是文件大小,而是内存中的图像大小 - 具有大量像素的非常大量压缩的图像可能会导致问题... (4认同)
  • 嗨,乔恩,谢谢你的评论.结果一直是一个受损的图像.*叹*.一个不称职的用户.谢谢你的答案:) (2认同)

Ian*_*cer 33

如果这不是一个糟糕的图像文件,但实际上是正常的问题,Image.FromFile其中它使文件句柄打开,那么使用该解决方案Image.FromStream.

using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
   using (Image original = Image.FromStream(fs))
   {
      ...
Run Code Online (Sandbox Code Playgroud)

使用显式Dispose(),using()语句或null在位图上设置值不能解决问题Image.FromFile.

因此,如果您运行App一段时间并打开许多文件,请考虑使用Image.FromStream().

  • 为什么不调用Dispose()释放图像的文件句柄?这只是实施中的一个错误吗?为什么微软从未修复过这个错误?显然,出于多种原因使用流更好,但似乎微软应该已经修复了这个问题或者完全删除了这个方法. (2认同)

小智 7

我今天遇到了同样的问题,同时为一个充满图像的文件夹创建缩略图图像.事实证明,"Out Of Memory"每次恰好出现在同一点.当我查看包含要转换的图像的文件夹时,我发现创建问题的文件是thumbs.db.我添加了一些代码以确保只转换图像文件并解决了问题.

我的代码基本上是

For Each imageFile as FileInfo in fileList
If imageFile.Extension = ".jpg" Or imageFile.Extension = ".gif" Then
    ...proceed with the conversion
End If
Next
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.