ImageList.Images.Add是否有更高效的替代方案?

时间:2009-06-27 19:54:01

标签: c# .net wpf winforms performance

我有一个winforms ImageList,其中包含200张256x256图像。

当我根据ANTS .NET分析器逐个添加图像时,花费在Add方法上的一半程序时间。

所以该程序需要10秒才能启动,5个花在那里。我觉得这很慢。

我使用ImageList.Images.AddRange实现了相同的功能。结果没有改变。

有没有人知道任何替代或优化来解决这个问题? WPF ImageList是否更快?是否有更快的winforms ImageList


编辑:

foreach (string imageFile in images)
{
    imageList.Images.Add(Image.FromFile(imageFile)); // takes pretty much all of program's execution time.
}

4 个答案:

答案 0 :(得分:2)

查看Microsoft的WPF示例应用程序之一PhotoSuru中的相册和列表视图。它们有几个不同的缩略图视图屏幕,加载速度非常快(所有图像都是异步加载的,只加载了必要的图像)。如果您正在寻找的话,还有完整的源代码可以帮助您入门。

它并不完全像Picasa(他们决定只显示完整行的照片而不是像Picasa那样部分覆盖的行),而是通过实现自己的虚拟化IScrollInfo面板(相当简单,Ben Constable有一个很棒的{{3} }),你应该能够获得你正在寻找的性能以及你想要的行为。

最后一点:您可能已经这样做了(您的图像是否存储为256x256像素图像?),但是当您尝试显示图像缩略图时,您将需要避免加载完整图像。从磁盘读取2 MB +图像文件只是为了渲染整个屏幕的256x256像素缩略图总是比读取适当大小的小缩略图图像具有更大的性能影响。如果可以,请将缩略图缓存到某个位置(如Windows和Picasa),或者至少尝试在遇到的任何JPEG文件中使用嵌入的缩略图。

答案 1 :(得分:1)

您是否正在使用ListList作为使用该ImageList的UI部件?

这类问题的一般解决方案是仅加载一些图像,因为一次只显示其中一些图像,然后根据需要加载另一个图像。对于这种情况,ListView具有VirtualMode属性。

一次加载和添加200张图片可能太多了,您可以加载第一个显示的图像,然后使用后台线程加载其他图像。看看Win7如何显示图像,它在滚动时显示一些占位符,然后在加载图像时显示真实图像。请注意,这不是一件简单的事情

答案 2 :(得分:0)

尝试使用我的代码here缩小图片并制作缩略图。

答案 3 :(得分:0)

是的。将图像加载到List<Image>。然后拨打ImageList.Images.AddRange(list)

List<Image> list = new List<Image>();
foreach (string imageFile in images)
{
    list.Add(Image.FromFile(imageFile)); 
}
imageList.Images.AddRange(list.ToArray());