System.Drawing.Image.FromFile() 抛出了“内存不足”的异常。

51

我有一个图片上传器和裁剪器,它可以创建缩略图,但是有时候在下面这一行会出现内存不足的异常:

Dim bm As Bitmap = System.Drawing.Image.FromFile(imageFile)

出错的情况非常罕见,但我总是想知道可能是什么原因。imageFile变量只是指向图像路径的Server.MapPath。

我很好奇是否有人之前遇到过这个问题,以及他们是否有任何想法可能是什么原因导致的?也许是图像的大小吗?

如果需要,我可以发布代码和任何支持性信息,但很想听听大家对此的看法。


你正在尝试加载的图片非常大吗? - RCIX
4
您确定所讨论的文件是有效的图像文件吗?我也遇到了完全相同的情况,但该文件无法在任何其他程序中加载。 - Dan Byström
1
我是danby,感谢您的回复。这不是我的图片,所以我会让它被发送过来并进行检查。上传的人特别无能,所以我希望只是这个问题! - dooburt
1
好的,图片已经损坏了。问题解决了。谢谢大家。Danby,如果你添加你的答案,我会将其标记为正确的 ;) - dooburt
遇到了类似的问题。注意到当尝试读取损坏的文件时,System.Drawing.Image.FromFile会引发OutOfMemoryException异常。如果您创建一个0字节的图像文件,然后像您所做的那样尝试从文件中读取它,就可以重现这个问题。 - Sola Oderinde
显示剩余3条评论
13个回答

0

我正在处理Tiff文件的批处理时遇到了同样的问题。大多数文件没有抛出异常,但是少数文件在ASP.NET 4.0中抛出了“内存不足”异常。我已经使用二进制数据找出了为什么只有少数文件会出现这种情况,并且这些文件都在同一个文件夹中。这不能是ASP.NET ASPNET或NETWORK SERVICE帐户的权限问题,因为其他文件都可以正常工作。

我已经打开了iTextSharp.text.Image类,并发现有许多重载的GetInstance()方法。我使用以下代码解决了我的问题:注意:catch块将运行有问题的文件。

                iTextSharp.text.Image image = null;
            try
                {
                    var imgStream = GetImageStream(path);
                     image = iTextSharp.text.Image.GetInstance(imgStream);
                }
                catch {
                    iTextSharp.text.pdf.RandomAccessFileOrArray ra = null;
                    ra = new iTextSharp.text.pdf.RandomAccessFileOrArray(path);
                    image = iTextSharp.text.pdf.codec.TiffImage.GetTiffImage(ra, 1);

                    if (ra != null)
                        ra.Close();

                }

在这种情况下,GetImageStream(path)方法在哪里?一旦您拥有iTextSharp.text.Image的图像对象,如何将其转换为System.Drawing.Image对象? - Chirag

0
如果您正在使用IIS,尝试回收应用程序池。这对我解决了类似的图像上传“内存不足”错误。

在尝试了许多方法之后,我做到了这一点 - 从图像中剥离元数据,在上传之前重命名文件,在系统的另一个部分上传,在上传简单(且较小的)图像等等,但都没有成功。最后尝试了上述的回收站操作,才成功地上传了原始图像。 - Rich

0

我创建了一个最小的表单示例,但仍然出现错误。

        private void button1_Click(object sender, EventArgs e)
    {
        string SourceFolder = ImageFolderTextBox.Text;
        string FileName = "";
        DirectoryInfo Mydir = new DirectoryInfo(SourceFolder);
        FileInfo[] JPEGS = Mydir.GetFiles("*.jpg");
        for (int counter = 0; counter < JPEGS.Count(); counter++)
        {
            FileName = Mydir + "\\" + JPEGS[counter].Name;
            //using (Image MyImage = System.Drawing.Image.FromFile(FileName))
            using (FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                StatusBtn.BackColor = Color.Green;
            }
        }
    }

我尝试了使用Image.FromFile()的注释行以及使用FileStream()的行。两者都产生了文件错误。

Image.FromFile()的错误是: System.OutOfMemoryException: '内存不足'

FileStream()的错误是: System.UnaurthorizedAccessException: '拒绝访问路径'E:\DCIM\100Canon\dsc_7218.jpg'。

我在产生错误的代码行之前放置了一个断点,我能够使用Windows图像查看器打开图像文件。然后我关闭了查看器,在我进入下一行并得到错误之后,我不能再使用Windows查看器查看图像。相反,我收到一个消息,告诉我没有权限访问该文件。我可以删除该文件。

这个错误是可重复的。我已经做了10多次。每次,在我得到错误之后,我都会删除用于FileName的文件。

所有文件都被验证为非损坏。

我原来使用的Image.FromFile()代码在2年前编译时运行良好。实际上,.exe文件也可以正常运行。我在代码的其他地方进行了微小的更改,但惊讶地发现,如果没有这个错误,代码将无法编译。根据此页面上的信息,我尝试了FileStream()方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接