1

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

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`
4

3 回答 3

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

坏的。您正在从文件中加载图像,检查结果是否为空......然后将其再次加载到新结果中,以便您可以处理它。虽然后一部分很愚蠢,但它无害。然而,第一部分是,因为结果Image永远不会被正确处理(如果/当 GC 收集它时,Image类型的终结器应该处理非托管资源,但这不是一个明智的依赖)。

顺便说一句,Image.FromFile永远不会回来null。如果它无法读取图像,那么它会抛出一个OutOfMemoryException.

该代码似乎也没有做任何事情,因为没有else块并且在块中没有做任何有意义的事情if

我的猜测是,您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
于 2010-03-15T18:46:16.833 回答
1

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

于 2010-03-15T19:01:29.343 回答
0

您必须考虑的是,无论存储在磁盘上的图片类型如何,当您打开它进行显示时,图片将变为位图,并且每个显示像素需要 4 个字节。

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

例如,假设您有 70 个 32 位色深的 jpeg,大小为 1920x1080 像素。您一次加载那么多图像的内存要求是:

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

这是一个相当低的估计。

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

于 2010-03-15T19:01:22.150 回答