2012-02-11 64 views
0

我正在写一个简单的图像调整大小的程序。通过将多个文件拖放到.exe上,它会通过并调整每个文件的大小。它可以运行到一个特定的点,在这个点上抛出一个OOM(内存不足)异常。我试过在位图上调用Dispose,并将其设置为Null,但似乎都没有做任何事情。如何从C#中的对象重用相同的内存? (特别是位图)

Bitmap current_image; 
for (int i = 0; i < imagesfilepath.Count; ++i) 
     { 
      // Load the image. 
      if (current_image != Null) 
      { 
       current_image.Dispose(); 
       current_image = Null; 
      } 
      current_image = (Bitmap)Image.FromFile(imagesfilepath[i], true); 

      // Resize it. 
      // Save it. 
     } 

使用1.5 GB后通常会抛出异常。我可以通过限制用户一次可以调整大小的图像数量来解决此问题,但不应该只能为1位图分配内存,并在每次迭代中重新使用它?

+0

可以显示代码以保存以及如何尝试释放资源吗? – BrokenGlass 2012-02-11 03:04:19

+0

我想我们真的需要在这里看到更多的代码。从你在那里,你不应该遇到这种例外。 – 2012-02-11 03:25:00

回答

3

Image.FromFile()抛出OutOfMemoryException异常时,该文件是不是有效的图像:

异常条件 OutOfMemoryException异常
的文件没有有效的图像格式。 - 或 - GDI +不支持该文件的像素格式。

是的,这是没有意义的,并且令人困惑,但它是什么。

MSDN:Image.FromFile

+0

所有的文件都完全一样。每个都是1.02 MB,我可以调整它们中的73个很好,74或更大,我得到这个: 在System.Drawing.dll中发生未处理的异常类型'System.OutOfMemoryException' 附加信息:内存不足。 – user1203277 2012-02-11 03:13:40

+1

尝试捕捉异常。如果你真的内存不足,那么捕捉它将不会有任何效果 - 你的记忆力已经不足。另一方面,如果您遇到GDI +错误,您的循环将继续。 – 2012-02-11 03:19:58

0

只要你处理图像,你不应该收到OutOfMemoryException异常。测试与以下片段处置允许程序成功完成,而不处置导致异常。

var path = @"C:\Users\mdearing\Desktop\Untitled.bmp"; 
for (var i = 0; i < 1000; i++) 
{ 
    var image = Bitmap.FromFile(path); 
    //image.Dispose(); //commenting this line out causes the OOM Exception 
} 
1

内存不足是由内存分割造成的,缺少所需大小的连续内存块。你应该使用相同的缓冲区来避免它。

相关问题