我正在使用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方法一切正常但如果我尝试加载大量图像,程序使用千兆字节的内存。我认为以这种方式处理图像存储器是不对的,但我不能提出另一种想法。如果有人可以提供帮助,我将非常感激
答案 0 :(得分:3)
两个问题:您要处置两次,而且只要父控件容器需要使用它,您将无法处理图像控件。当处理表格时,它将导致所有控件都被处理掉,作为其容器的一部分。
所以,比试图处理两次要少得多,根本不要处置(这里就是这样)!
答案 1 :(得分:2)
显示图像时无法处理图像。如果这样做,表单将无法显示。
将PictureBox
实例分配给Image
属性时,Image
不会复制{{1}}实例。它会保留实例,因此在从图片框中删除图像之前,您无法将其丢弃。