为什么我总是得到'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);
        }
    }
}

为什么我总是得到'System.OutOfMemoryException'

这可能是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))
{
    // ...
}