C# 是否有比ImageList.Images.Add更高性能的替代方案?

C# 是否有比ImageList.Images.Add更高性能的替代方案?,c#,.net,wpf,winforms,performance,C#,.net,Wpf,Winforms,Performance,我有一个winformsImageList,其中包含200个256x256图像 根据ANTS.NET profiler,当我添加图像时,程序花费在add方法上的时间的一半是1乘1 因此,该计划需要10秒启动,5秒在那里花费。在我看来,这是非常缓慢的 我使用ImageList.Images.AddRange实现了同样的功能。结果没有改变 有人知道解决这个问题的任何替代方案或优化吗?WPFImageList是否更快?是否有更快的winformsImageList 编辑: 您是否使用该ImageLi

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

根据ANTS.NET profiler,当我添加图像时,程序花费在
add
方法上的时间的一半是1乘1

因此,该计划需要10秒启动,5秒在那里花费。在我看来,这是非常缓慢的

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

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


编辑:
您是否使用该ImageList为UI部件使用ListView

这类问题的一般解决方案是只加载部分图像,因为一次只显示其中一些图像,然后根据需要加载另一个图像。ListView具有用于此类场景的属性


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

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

它不像Picasa(他们决定只显示整行照片,而不是像Picasa那样显示部分覆盖的一行),而是通过实现您自己的虚拟化IScrollInfo面板(相当简单,Ben Constable有一个很棒的功能),您应该能够获得您想要的性能和行为


最后一点注意:您可能已经在这样做了(您的图像是否存储为256x256像素图像?)。从磁盘上读取2MB以上的图像文件,只是为了渲染一整屏256x256像素的缩略图,与读取大小合适的小缩略图相比,其性能影响总是更大。如果可以,请将缩略图缓存到某个位置(如Windows和Picasa所做的),或者至少尝试在遇到的任何JPEG文件中使用嵌入的缩略图。

尝试使用我的代码缩小图像的比例并制作缩略图。

是的。将图像加载到
列表
。然后调用
ImageList.Images.AddRange(list)

List List=新列表();
foreach(图像中的字符串imageFile)
{
list.Add(Image.FromFile(imageFile));
}
imageList.Images.AddRange(list.ToArray());

根据你的新问题,这个问题应该结束吗?嗨,乔恩,我不这么认为。这一个用于ImadeList.Images.Add,另一个用于Images.FromFile。它们很相似,我在同一个应用程序中使用了它们,但两者都会减慢应用程序的速度。但是如果你认为它们是一样的,请放心:)顺便说一句,我在这两个版本中都使用了相同的第一句话,如果这是你所关心的?WPF没有ImageList:决定使用什么将取决于你使用ImageList的目的。我使用ImageList在我的应用程序中实现了一个win7 explorer样式的视图,具有非常大的图标。谢谢。唯一让我担心的是我想要一个平滑的卷轴,这样就不会出现占位符。我知道计数不能超过500。因此,人们将能够快速浏览那里的图像。但是,如果它像picasa一样工作,你看不到占位符图像,但当你滚动时,它不会一次加载所有图像,那么它就可以工作。picasa使用预先构建的索引和缩放和优化的图像,因此如果你想获得类似的结果,你必须使用类似的方法。谢谢Nicholas。你是说我用手预先设定图像的比例?有没有一种方式可以说“在.net中以256x256的形式加载此2K映像?不,您不需要手动执行此操作。image.GetThumbnailImage应该可以为您执行此操作。
foreach (string imageFile in images)
{
    imageList.Images.Add(Image.FromFile(imageFile)); // takes pretty much all of program's execution time.
}
List<Image> list = new List<Image>();
foreach (string imageFile in images)
{
    list.Add(Image.FromFile(imageFile)); 
}
imageList.Images.AddRange(list.ToArray());