如何从C#中的对象重用相同的内存? (特别是位图)

时间:2012-02-11 02:58:54

标签: c# exception memory bitmap

我正在编写一个简单的图像大小调整程序。通过将多个文件拖到.exe上,它将通过并调整每个文件的大小。它可以工作到抛出OOM(内存不足)异常的某个点。我尝试在位图上调用Dispose并将其设置为Null,但似乎都没有做任何事情。

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个位图分配内存,并且每次迭代都重复使用它?

3 个答案:

答案 0 :(得分:3)

当文件不是有效图像时,Image.FromFile()会抛出OutOfMemoryException:

  

例外情况   OutOfMemoryException异常
  该文件没有有效的图像格式。   -要么-   GDI +不支持文件的像素格式。

是的,这没有任何意义,令人困惑,但它就是它。

MSDN:Image.FromFile

答案 1 :(得分:1)

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

答案 2 :(得分: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
}