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

它似乎工作正常,但对于较大的图像来说速度会慢很多。

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

谢谢,彼得

有帮助吗?

解决方案

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

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

其他提示

我将补充 skamradt 的答案,并尝试将其设计得尽可能快。为此你应该

  • 优化输入/输出
  • 使用多个线程来利用多个 CPU 核心,并在读取(或写入)文件时保持单个 CPU 核心工作

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

使用多线程时,不要导致多个并发 I/O 操作,这一点很重要。如果您选择将缩略图写回文件,那么一旦您开始读取文件,您就应该完全读取它,一旦开始写入文件,您也应该完全写入它。交错这两个操作会杀死你的 I/O,因为你可能会导致硬盘磁头的大量查找操作。

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

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

编辑:

在重新阅读您的问题时,我注意到您可能只需要调整一张图像的大小,在这种情况下,单个后台线程当然就足够了。无论如何,我都会保留我的答案,也许有时对其他人有用。这是我从我的最新项目之一中了解到的,其中最终程序可能需要更高的速度,但在高峰时间只使用了大约 75% 的四核机器。将 I/O 与处理分离将会产生不同的结果。

我经常使用带有Scale的TJPEGImage:= jsEighth(在Delphi 7中)。这非常快,因为JPEG解压缩可以跳过大量数据来填充宽度和高度仅为八分之一的位图。

另一种选择是使用 shell的方法来提取缩略图,这非常快井

我从事视觉业务,我只是使用OpenGL将图像上传到GPU。 (通常为每秒20x 2048x2000x8bpp),每个纹理一个bmp,并让视频标尺(win32,Mike Lischke的opengl标题)

上传这样的图像需要5-10毫秒,具体取决于确切的显卡(如果没有集成和nvidia 7300系列或更新版本。最新的集成GPU也可能是可行的)。缩放和显示成本300us。这意味着客户可以疯狂地平移和缩放,而无需触摸应用程序。我在它上面绘制了一个叠加层(以前是一个tmetafile但现在是一个自己的格式)。

我最大的画面是4096x7000x8bpp,显示并在30ms以下缩放。 (GF 8600)

此技术的局限性是最大纹理尺寸。它可以通过将图片分割成多个纹理来解决,但我还没有打扰,因为我使用软件提供系统。

(一些典型尺寸: nv6x00系列:2k * 2k,但与GDI相比,上传几乎是收支平衡 nv7x00系列:4k * 4k对我来说基线卡。 GF7300的价格是20-40美元 nv8x00系列:8k * 8k )

请注意,这可能不适合所有人。但是如果您处于幸运状态以指定硬件限制,它可能会起作用。主要问题是像Thinkpad这样的笔记本电脑,它们的GPU比avg笔记本电脑更老,而这些笔记本电脑往往落后于台式电脑。

我选择OpenGL而不是DirectX,因为它在时间上更加静态,更容易找到非游戏相关的例子。

尝试查看 Graphics32库:它非常擅长绘制内容和工作很棒使用Bitmaps。它们是线程安全的好例子,它完全免费。

利用Windows容量创建缩略图。还记得在包含图像的文件夹中隐藏了Thumbs.db文件吗?

我在VB中实现了类似这个功能的东西。我的软件能够在大约10秒内构建100个文件(混合大小)的缩略图。

我无法将其转换为Delphi。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top