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