ArgumentException on Image.Dispose()

本文关键字:Dispose Image on ArgumentException | 更新日期: 2023-09-27 18:10:33

我正在使用Windows表单制作相册应用程序,但我有一个无法解决的问题。首先,我有一个表单,我可以在其中创建一个TableLayoutPanel。之后,我创建了一个方法,其中我生成的图片框数量与我打开的目录中的图像数量相同。当我尝试处理我在图片框中加载的图像时,会出现此问题,因为我需要释放其内存。这是该方法的代码:

public void createPictureBoxes()
    {
        Image loadedImage;
        int imageCounter = 0;
        for (int i = 0; i < rowCounter; i++)
            for(int p = 0; p < imagesTable.ColumnCount; p++)
            {
                PictureBox pb = new PictureBox();
                pb.SizeMode = PictureBoxSizeMode.Zoom;
                pb.Width = imagesTable.GetColumnWidths()[p];
                pb.Height = imagesTable.GetRowHeights()[i];
                pb.Click += new EventHandler(enlargeThumbnail);
                try
                {
                    loadedImage = Image.FromFile(images[imageCounter++]);
                    pb.Image = loadedImage;
                    loadedImage.Dispose();
                    imagesTable.Controls.Add(pb);
                    loadedImage.Dispose();
                }
                catch (IndexOutOfRangeException)
                {
                    break;
                }
            }
    }

程序在表单的 Show(( 方法上抛出一个 ArgumentException,告诉我该参数无效。如果没有dispose方法,一切正常,但是如果我尝试加载大量图像,程序将使用千兆字节的内存。我想以这种方式处理图像内存是不对的,但我不能提出另一个想法。如果有人能帮忙,我将不胜感激

ArgumentException on Image.Dispose()

两个问题:你要释放两次,而且只要父控件容器预期使用它,你就无法释放它。释放窗体时,将导致释放作为其容器一部分的所有控件。

因此,比尝试处理两次要少得多,根本不要处理(在这里,就是这样(!

显示

图像时无法释放图像。如果这样做,窗体将无法显示它。

Image实例分配给 Image 属性时,PictureBox不会创建该实例的副本。它保留实例,因此在从图片框中删除图像之前无法释放它。