如何重用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个位图分配内存,并在每次迭代中重复使用它吗?
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
}
内存不足是由内存分段引起的,缺少所需大小的连续内存块。您应该使用相同的缓冲区来避免它。