加载和重新调整图像大小的最快方法是什么?

Pie*_*Wyk 5 delphi image thumbnails filestream

我需要在给定目录中显示图像的缩略图.在将图像加载到图像组件之前,我使用TFileStream来读取图像文件.然后将位图的大小调整为缩略图大小,并分配给TScrollBox上的TImage组件.

它似乎工作正常,但是对于较大的图像,速度会慢下来.

是否有更快的方法从磁盘加载(图像)文件并调整它们的大小?

谢谢,彼得

ska*_*adt 5

并不是的.您可以做的是在后台线程中调整它们的大小,并使用"占位符"图像,直到调整大小完成.然后我会将这些已调整大小的图像保存到某种缓存文件中以供稍后处理(Windows会执行此操作,并在当前目录中调用缓存thumbs.db).

线程架构本身有几个选项.执行所有映像的单个线程,或者线程只知道如何处理单个映像的线程池.该AsyncCalls库甚至是另一种方式,可以让事情变得相当简单.


mgh*_*hie 5

我将通过skamradt补充答案,试图尽可能快地设计它.为此你应该

  • 优化I/O.
  • 使用多个线程来使用多个CPU内核,并在读取(或写入)文件时保持单个CPU内核的工作

使用多个线程意味着使用VCL类进行大小调整不会起作用,因为VCL不是线程安全的,并且所有的hack都不能很好地扩展.efg的计算机实验室有图像处理代码的链接.

在使用多个线程时,不要导致多个并发I/O操作很重要.如果您选择将缩略图图像写回文件,那么一旦您开始阅读文件,您应该完全阅读它,一旦您开始编写文件,您也应该完全编写它.交错这两个操作将会导致您的I/O中断,因为您可能会对硬盘磁头进行大量的搜索操作.

为了获得最佳结果,文件的读取(和写入)也不应该发生在应用程序的主(GUI)线程中.这表明以下设计:

  • 让一个线程将文件读入TGraphic对象,并将它们放入线程安全列表中.
  • 让一个线程池在原始大小的文件列表上等待,并让一个线程处理一个TGraphic对象,将其调整为另一个TGraphic对象,并将其添加到另一个线程安全列表中.
  • 为添加到列表中的每个缩略图图像通知GUI线程,以便可以显示它.
  • 如果要将缩略图写入文件,也请在阅读主题中执行此操作(有关说明,请参见上文).

编辑:

在重新阅读您的问题时,我注意到您可能只需要调整一个图像的大小,在这种情况下,单个后台线程当然就足够了.无论如何,我会留下我的答案,也许它会在某个时候对别人有用.这是我从我最近的一个项目中学到的,最终的程序可能需要更高的速度,但在高峰时段只使用了大约75%的四核机器.将I/O与处理分离会产生差异.