我正在创建一个图片库,我需要从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);
}
}
答案 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),但上面应该可以正常工作。