加快加载图像列表

时间:2010-10-28 20:25:40

标签: c# generic-list

我正在从大约250张图片的文件夹中加载List<Image>。我做了一个DateTime比较,加载这250个图像需要整整11秒。那个地狱很慢,我非常想加快速度。

图像在我的本地硬盘上,甚至不在外部硬盘上。

代码:

DialogResult dr = imageFolderBrowser.ShowDialog();
if(dr == DialogResult.OK) {

    DateTime start = DateTime.Now;

    //Get all images in the folder and place them in a List<>
    files = Directory.GetFiles(imageFolderBrowser.SelectedPath);
    foreach(string file in files) {
        sourceImages.Add(Image.FromFile(file));
    }
    DateTime end = DateTime.Now;

    timeLabel.Text = end.Subtract(start).TotalMilliseconds.ToString();
}
编辑:是的,我需要所有的照片。我正在计划的事情是将每个中心的30个像素柱取出并从中制作出新的图像。有点像360度的图片。只是现在,我只是用随机图像进行测试。

我知道可能有更好的框架可以做到这一点,但我需要先做这件事。

EDIT2:切换到秒表,差别只有几毫秒。还尝试使用Directory.EnumerateFiles,但没有任何区别。

EDIT3:我在32位Win7客户端上运行.NET 4。

6 个答案:

答案 0 :(得分:3)

你真的需要加载所有图像吗?你可以逃脱加载它们吗?或者,你可以在一个单独的线程上加载它们吗?

答案 1 :(得分:2)

您无法加快硬盘访问和解码速度。但是,一个好主意是将图像加载到后台线程中。

也许您应该考虑在实际加载图像之前显示占位符。

警告:无论如何,您都需要在UI线程中插入已加载的图像!

答案 2 :(得分:2)

您可以使用Directory.EnumerateFiles和Parallel.ForEach将工作分散到尽可能多的CPU上。

var directory = "C:\\foo";
var files = Directory.EnumerateFiles(directory, "*.jpg");
var images = files.AsParallel().Select(file => Image.FromFile(file)).ToList();

答案 3 :(得分:1)

在加载图像时,文件IO和CPU都工作,你应该通过使用多个线程获得一些speadup。

如果您使用.net 4,则可以使用任务。

答案 4 :(得分:1)

鉴于您可能已经知道路径(来自对话框?),您最好使用Directory.EnumerateFiles,然后使用它返回的集合而不是列表。

http://msdn.microsoft.com/en-us/library/dd383458.aspx

[编辑]

刚刚注意到你还在循环中将文件加载到你的应用中 - 它们有多大?根据它们的大小,它实际上可能是一个非常好的速度!

此时你需要加载它们吗?你能在其他地方更改一些显示代码以按需加载吗?

答案 5 :(得分:0)

你可能无法加快速度,因为瓶颈是从磁盘读取文件本身并可能将它们解析为图像。

您可以做的是在加载后缓存列表,然后对代码的任何后续调用都会快得多。