将图像添加到图像列表并将其显示到列表视图中时出现内存不足的异常

时间:2014-09-22 08:54:20

标签: c# winforms out-of-memory

我正在创建一个图片库,我需要从1个目录加载2 GB以上的图像到列表视图。

当我浏览200 mb以上的文件夹时,它显示错误OUT OF MEMORY。

我的代码是

        _filenames = new List<string>();
             DirectoryInfo dir = new DirectoryInfo(@root + "gallery");
            foreach (FileInfo file in dir.GetFiles())
            {
               if (file.Name != "desktop.ini")
                {
                    var image = Image.FromFile(file.FullName);
                    _filenames.Add(file.Name.ToLower());
                    imageList1.Images.Add(image);
                }
                else
                {
                    break;
                }

            }                           
            listView1.View = View.LargeIcon;
            imageList1.ImageSize = new Size(75,75);
            listView1.LargeImageList = imageList1;
            for (int i = 0; i < imageList1.Images.Count; i++)
            {
                var item = new ListViewItem();
                item.ImageIndex = i;
                item.Text = _filenames[i];
                listView1.Items.Add(item);
            }

        }

1 个答案:

答案 0 :(得分:2)

您需要(作为第一个)在添加到列表之前执行您的图像操作

  

执行其他操作,例如设置ColorDepth或   ImageSize将导致重新创建句柄。因此,你应该   在将图像添加到ImageList之前执行这些操作。

来自MSDN

更新以下说明:

为了创建自己的文件列表(假设您在目录中有目录名和文件名),您可以创建一个FileInfo[]数组,如下所示:

// Prepare the directory and file names
var directoryName = "C:\\Temp\\MyFolder";
var filenames = new List<string>();
filenames.Add("0001.jpg");
filenames.Add("2345.jpg");

// Construct FileInfo array - using System.IO
var files = new FileInfo[filenames.Count];
for (var i = 0; i < filenames.Count; i++)
{
    var fileName = filenames[i];
    files[i] = new FileInfo(Path.Combine(directoryName, fileName));
}

有很多方法可以构造FileInfo[]数组(例如LINQ),但上面应该可以正常工作。