内存不足,在一个图片框中有多个图像

当我尝试将一些图像加载到一个图片框中时,我遇到了内存不足的问题。

public void button2_Click(object sender, EventArgs e) { FolderBrowserDialog dialog = new FolderBrowserDialog(); dialog.ShowDialog(); string selected = dialog.SelectedPath; string[] imageFileList = Directory.GetFiles(selected); int iCtr = 0,zCtr = 0; foreach(string imageFile in imageFileList) { if (Image.FromFile(imageFile) != null) { Image.FromFile(imageFile).Dispose(); } PictureBox eachPictureBox = new PictureBox(); eachPictureBox.Size = new Size(100,100); // if (iCtr % 8 == 0) //{ // zCtr++; // iCtr = 0; //} eachPictureBox.Location = new Point(iCtr * 100 + 1, 1); eachPictureBox.Image = Image.FromFile(imageFile); iCtr++; panel1.Controls.Add(eachPictureBox); } }`enter code here` 

 if (Image.FromFile(imageFile) != null) { Image.FromFile(imageFile).Dispose(); } 

坏。 您正在从文件加载图像,检查结果是否为null …然后再次将其加载到新结果中以便您可以处置它。 虽然后一部分是愚蠢的,但它没有害处。 然而,第一部分是由于生成的Image从未被正确处理(如果/当GC收集它时, Image类型上的终结器应该处理非托管资源,但这不是明智的依赖)。

顺便说一下, Image.FromFile永远不会返回null 。 如果它无法读取图像,则会抛出OutOfMemoryException

代码似乎也什么都不做,因为没有else块, else块中没有任何意义。

我的猜测是你的OutOfMemoryException来自于该目录中的一个或多个文件以损坏或不支持的图像格式存储 ,或者根本不是图像。

尝试使用以下代码替换foreach的代码:

 try { Image image = Image.FromFile(imageFile); PictureBox eachPictureBox = new PictureBox(); eachPictureBox.Size = new Size(100,100); eachPictureBox.Location = new Point(iCtr * 100 + 1, 1); eachPictureBox.Image = Image.FromFile(imageFile); iCtr++; panel1.Controls.Add(eachPictureBox); } catch(OutOfMemoryException) { } // skip the file 

图片框内部包含对您放置在其中的位图的引用。 除非你摆脱了图片框,否则它会对你加载到它的每个位图进行引用。

无论存储在磁盘上的图片类型如何,当你打开它进行显示时,你需要考虑的事情是图片将成为一个位图,每个显示的像素需要4个字节。

您的代码似乎建议尝试缩略图操作。 事实上,您将70个文件加载到内存中,无论显示大小如何,在内存中它们都会非常大。

例如,假设您有32位颜色深度的70个jpeg,并且说大小为1920×1080像素。 你的内存需求一次性加载那么多图像是:

  70 pics x 1920 pixels x 1080 pixels x 4 bytes/pixel = 580,608,000 bytes! 

这是一个相当低的估计。

您可以考虑加载更少的图片或尝试真正的缩略图解决方案。