为什么我总是得到'System.OutOfMemoryException'
本文关键字:System OutOfMemoryException 为什么 | 更新日期: 2023-09-27 18:17:58
这是我的代码,我正试图将两张图片拼接在一起,一旦我得到第42行"Image img = Image. fromfile (file.FullName);"我得到一个内存不足错误。我该怎么办?
namespace Practicing_Stiching
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void cmdCombine_Click(object sender, EventArgs e)
{
//Change the path to location where your images are stored.
DirectoryInfo directory = new DirectoryInfo(@"C:'Users'Elder Zollinger'Desktop'Images");
if (directory != null)
{
FileInfo[] files = directory.GetFiles();
CombineImages(files);
}
}
private void CombineImages(FileInfo[] files)
{
//change the location to store the final image.
string finalImage = @"C:'Users'Elder Zollinger'Desktop'Images";
List<int> imageHeights = new List<int>();
int nIndex = 0;
int width = 0;
foreach (FileInfo file in files)
{
Image img = Image.FromFile(file.FullName);
imageHeights.Add(img.Height);
width += img.Width;
img.Dispose();
}
imageHeights.Sort();
int height = imageHeights[imageHeights.Count - 1];
Bitmap img3 = new Bitmap(width, height);
Graphics g = Graphics.FromImage(img3);
g.Clear(SystemColors.AppWorkspace);
foreach (FileInfo file in files)
{
Image img = Image.FromFile(file.FullName);
if (nIndex == 0)
{
g.DrawImage(img, new Point(0, 0));
nIndex++;
width = img.Width;
}
else
{
g.DrawImage(img, new Point(width, 0));
width += img.Width;
}
img.Dispose();
}
g.Dispose();
img3.Save(finalImage, System.Drawing.Imaging.ImageFormat.Jpeg);
img3.Dispose();
imageLocation.Image = Image.FromFile(finalImage);
}
}
}
这可能是GDI在捉弄你。
您看,当GDI遇到未知文件时,它很可能会导致OutOfMemoryException
。由于您根本没有过滤输入图像,我希望您只是抓取非图像文件(或GDI无法理解的图像类型)。
哦,还有一点——确保你在保存JPEG时设置了JPEG质量——默认值是75,这对于很多图像来说是相当糟糕的。请务必使用using
-它非常方便,以确保适当和及时的清理:)
获取更多内存!
但说真的,您似乎没有过滤掉非图像文件的文件。有一些隐藏的文件在文件夹中,你可能会试图打开一个图像意外,如"Thumbs.db"。确保该文件是一个类似if (Path.GetExtension(file.FullPath) != ".png") continue;
的图像。
同样,在调用.Dispose()
的对象上,考虑将它们包装在using()
中。例如:
using(var img = Image.FromFile(file.FullPath))
{
// ...
}