c# - 为什么我一直收到 'System.OutOfMemoryException' ?

标签 c# out-of-memory

这是我的代码,我试图将两张图片拼接在一起,一旦我到达第 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 - 确保正确及时清理非常方便:)

关于c# - 为什么我一直收到 'System.OutOfMemoryException' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25315407/

相关文章:

c# - 如何异步渲染局部 View

java - Android Admob Interstitial 内存泄漏

java - 用Java缓存大量空间数据——可行吗?

c# - Newtonsoft.Json - 反序列化大对象时出现内存不足异常

java - 这段Java代码中如何处理堆内存不足的情况?

java - 使用netty高速发送消息时出现OOM异常

c# - 以编程方式设置验证控件的文本

c# - 尝试替换空字符串时无法识别的转义序列

c# - Aes 加密 MemoryStream.ToArray 为空

c# - 双例模式实现