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

本文关键字:内存 尤其是 位图 何重用 对象 | 更新日期: 2023-09-27 18:24:01

我正在编写一个简单的图像大小调整程序。通过将多个文件拖到.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个位图分配内存,并在每次迭代中重复使用它吗?

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

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

异常情况内存不足异常
该文件没有有效的图像格式。-或-GDI+不支持该文件的像素格式。

是的,这毫无意义,令人困惑,但事实就是如此。

MSDN:Image.FromFile

只要处理了图像,就不会收到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
}

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