C# 为什么我总是得到一个“System.OutOfMemoryException”?

C# 为什么我总是得到一个“System.OutOfMemoryException”?,c#,out-of-memory,C#,Out Of Memory,这是我的代码,我正在尝试将两张图片缝合在一起,当我到达第42行Image img=Image.FromFilefile.FullName;我得到一个内存不足的错误。我该怎么办 namespace Practicing_Stiching { public partial class Form1 : Form { public Form1() { InitializeComponent(); }

这是我的代码,我正在尝试将两张图片缝合在一起,当我到达第42行Image img=Image.FromFilefile.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左右,这对很多图像来说都很糟糕。请务必使用-它非常方便,可以确保正确及时地清理:

这很可能是GDI在捉弄你

您知道,当GDI遇到未知文件时,很可能会导致OutOfMemoryException。因为您根本没有过滤输入图像,所以我希望您只是获取非图像文件或GDI不理解的图像类型

哦,还有一点横向-确保在保存JPEG时设置JPEG质量-默认值为75左右,这对很多图像来说都很糟糕。请务必使用-它非常方便,可以确保正确及时地清理:

获取更多内存

但说真的,您似乎并没有过滤掉不是图像文件的文件。文件夹中有一些隐藏的文件,您可能试图意外地将其作为图像打开,例如Thumbs.db。确保该文件是一个具有类似if Path.GetExtensionfile.FullPath!=。png继续

也就是说,对正在调用的对象进行处理。例如:

using(var img = Image.FromFile(file.FullPath))
{
    // ...
}
获得更多的记忆

但说真的,您似乎并没有过滤掉不是图像文件的文件。文件夹中有一些隐藏的文件,您可能试图意外地将其作为图像打开,例如Thumbs.db。确保该文件是一个具有类似if Path.GetExtensionfile.FullPath!=。png继续

也就是说,对正在调用的对象进行处理。例如:

using(var img = Image.FromFile(file.FullPath))
{
    // ...
}


我建议将您对IDisposable项的所有使用包装在using子句中。生成的图像有多大?我认为一个更合适的问题是,所有初始图像有多大?这就是轰炸的地方。您一次打开的图像太多,或者出现了类似情况。使用当前代码,您必须获得更多RAM。否则,更好的技术可能会有所帮助。另外,请告诉我们windows server 2003的.NET和OS plus 32x或64x版本。只有两个映像?该文件夹中是否有任何非图像?隐藏文件?也许你应该过滤到.jpg。文件夹中只有2个jpeg文件。你确定显示了隐藏的文件吗?它可能是thumbs.db或类似的东西:我建议将您对IDisposable项的所有使用包装在using子句中。生成的图像有多大?我认为一个更合适的问题是,所有初始图像有多大?这就是轰炸的地方。您一次打开的图像太多,或者出现了类似情况。使用当前代码,您必须获得更多RAM。否则,更好的技术可能会有所帮助。另外,请告诉我们windows server 2003的.NET和OS plus 32x或64x版本。只有两个映像?该文件夹中是否有任何非图像?隐藏文件?也许你应该过滤到.jpg。文件夹中只有2个jpeg文件。你确定显示了隐藏的文件吗?它可能是thumbs.db或类似的东西:非常感谢您,它工作得非常好。我确实在文件夹中有另一个文件。如果它解决了您的问题,请不要忘记将其标记为解决方案!祝你好运。还有一个简单的问题,没有完全解决,它不允许我使用FullPath,并说错误'System.IO.FileSystemInfo.FullPath'由于其保护级别而无法访问。老实说,我从不使用FileInfo或DirectoryInfo。尝试使用Directory.GetFiles.,*.png(它只会给您字符串)和Path.GetFullPathp。我几乎总是使用静态目录、文件和路径类。非常感谢,这非常有效。我确实在文件夹中有另一个文件。如果它解决了您的问题,请不要忘记将其标记为解决方案!祝你好运。还有一个简单的问题,没有完全解决,它不允许我使用FullPath,并说错误'System.IO.FileSystemInfo.FullPath'由于其保护级别而无法访问。老实说,我从不使用FileInfo或DirectoryInfo。尝试使用Directory.GetFiles.,*.png(它只会给您字符串)和Path.GetFullPathp。我几乎总是使用静态目录、文件和路径类。