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方法,一切正常,但是如果我尝试加载大量图像,程序将使用千兆字节的内存。我想以这种方式处理图像内存是不对的,但我不能提出另一个想法。如果有人能帮忙,我将不胜感激
两个问题:你要释放两次,而且只要父控件容器预期使用它,你就无法释放它。释放窗体时,将导致释放作为其容器一部分的所有控件。
因此,比尝试处理两次要少得多,根本不要处理(在这里,就是这样(!
显示
图像时无法释放图像。如果这样做,窗体将无法显示它。
将Image
实例分配给 Image
属性时,PictureBox
不会创建该实例的副本。它保留实例,因此在从图片框中删除图像之前无法释放它。