如何加快向ImageList添加图像的速度

本文关键字:图像 速度 添加 ImageList 何加快 | 更新日期: 2023-09-27 18:30:14

所以我试图在列表视图中填充大量图标。为了避免漫长的等待时间,我试图让它加载前1000个结果,然后如果用户按下"加载更多"按钮,则加载更多。

这就是我被卡住的地方。如果我一次加载所有10000多个图标,需要37秒。然而,如果我决定每次用户点击按钮时再添加500个图标,则需要40秒,这比一次添加所有图标更糟糕!代码中唯一的区别是,我必须将这一行作为委托,以避免跨线程问题。有更快的方法吗?

for (int i = lastLoadedIndex; i < lastLoadedIndex+500; i++)
{
    string file = resultArr[i];
    Invoke((MethodInvoker)delegate()
    {
        this.imageList1.Images.Add(Image.FromFile(file));
    });
}

如何加快向ImageList添加图像的速度

若要加快任何批量操作,请考虑使用bulk方法(如果可用)
例如,ImageCollection类型具有AddRange方法
尝试使用它:

int newCount = 500;
// Get a desired part of the `resultArr` array as a new array:
string[] tmp = new string[newCount];
Array.Copy(resultArr, lastLoadedIndex, tmp, 0, newCount);
// Load images:
Image[] images = Array.ConvertAll(tmp, file => Image.FromFile(file));
// Bulk add images to the ImageList:
Invoke((MethodInvoker)(() => imageList1.Images.AddRange(images)));

如果没有帮助,请检查哪个操作较慢:读取图像或附加到ImageList

EDIT#2:函数的昂贵部分是从文件加载图像。将它放在锁定互斥体之前应该允许一些并行性,这相当于使用互斥体的开销。不,这种方法不能保持秩序。编辑:将图像直接添加到图像列表中,而不是添加到临时集合中。

public void LoadImagesFromFiles(string[] files)
{
    Mutex imageListLock = new Mutex();
    files.AsParallel().ForAll(file =>
    {
        var img = Image.FromFile(file);
        imageListLock.WaitOne();
        this.imageList1.Images.Add(img);
        imageListLock.ReleaseMutex();
    });
}