Image.Dispose()上的ArgumentException

时间:2013-04-24 07:27:12

标签: c# winforms

我正在使用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方法一切正常但如果我尝试加载大量图像,程序使用千兆字节的内存。我认为以这种方式处理图像存储器是不对的,但我不能提出另一种想法。如果有人可以提供帮助,我将非常感激

2 个答案:

答案 0 :(得分:3)

两个问题:您要处置两次,而且只要父控件容器需要使用它,您将无法处理图像控件。当处理表格时,它将导致所有控件都被处理掉,作为其容器的一部分。

所以,比试图处理两次要少得多,根本不要处置(这里就是这样)!

答案 1 :(得分:2)

显示图像时无法处理图像。如果这样做,表单将无法显示。

PictureBox实例分配给Image属性时,Image不会复制{{1}}实例。它会保留实例,因此在从图片框中删除图像之前,您无法将其丢弃。