代码之家  ›  专栏  ›  技术社区  ›  Pieter van Wyk

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

  •  5
  • Pieter van Wyk  · 技术社区  · 17 年前

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

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

    有没有更快的方法从磁盘加载(映像)文件并调整其大小?

    谢谢,彼得

    6 回复  |  直到 17 年前
        1
  •  5
  •   skamradt    17 年前

    线程体系结构本身有几个选项。执行所有映像的单个线程,或者一个线程池,其中一个线程只知道如何处理单个映像。这个 AsyncCalls 图书馆甚至是另一种方式,可以让事情变得相当简单。

        2
  •  5
  •   mghie    17 年前

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

    • 使用多个线程使用多个CPU内核,并在读取(或写入)文件时保持单个CPU内核工作

    使用多线程意味着使用VCL类来调整大小是行不通的,因为VCL不是线程安全的,而且所有的黑客攻击都不能很好地扩展。 efg's Computer Lab

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

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

    • 让一个线程将文件读入TGraphic对象,并将其放入线程安全列表中。
    • 让线程池等待原始大小的文件列表,让一个线程处理一个TGraphic对象,将其调整为另一个TGraphic对象,并将其添加到另一个线程安全列表。
    • 为添加到列表中的每个缩略图通知GUI线程,以便显示。

    编辑:

    在重读你的问题时,我注意到你可能只需要调整一幅图像的大小,在这种情况下,一条背景线当然就足够了。无论如何,我会把我的答案留在原地,也许有一天它会对其他人有用。这是我从我最近的一个项目中学到的,最终的程序可能需要更高的速度,但在高峰期只使用了大约75%的四核机器。将I/O与处理分离会带来不同。

        3
  •  4
  •   Stijn Sanders    17 年前

    我经常使用TJPEGImage,其比例为:=JS8th(在Delphi7中)。这真的很快,因为JPEG反压缩可以跳过大量数据来填充宽度和高度仅为八分之一的位图。

    另一个选择是使用 shell's method to extract a thumbnail ,速度也相当快

        4
  •  1
  •   Marco van de Voort    17 年前

    上传这样的图像需要5-10毫秒的时间,具体取决于视频卡(如果没有集成和nvidia 7300系列或更高版本,也可以使用最新的集成GPU)。缩放和显示成本为300美元。这意味着客户可以在不触摸应用程序的情况下疯狂地平移和缩放。我在它上面画了一个覆盖图(以前是一个tmetafile,但现在是自己的格式)。

    我最大的图片是4096x700x8bpp,显示和缩放时间不到30毫秒。(绿表8600)

    该技术的一个限制是最大纹理大小。它可以通过将图片分割成多个纹理来解决,但我还没有费心,因为我用软件交付了系统。

    nv6x00系列:2k*2k但与GDI相比,上传几乎是收支平衡 nv7x00系列:4k*4k为我提供基线卡。GF7300大约20-40美元 nv8x00系列:8k*8k )

    这张纸条可能不是给每个人的。但是如果您幸运地指定了硬件限制,那么它可能会起作用。主要问题是像ThinkPad这样的笔记本电脑,它们的GPU比avg笔记本电脑要老,而avg笔记本电脑往往比台式电脑落后一代。

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

        5
  •  0
  •   Olivier Pons    17 年前

    Graphics32 library 字体它非常擅长画东西和作品 使用位图。它们是线程安全的,有很好的示例,而且是完全免费的。

        6
  •  0
  •   Jan Doggen    10 年前

    利用windows的功能创建缩略图。还记得在包含图像的文件夹中隐藏Thumbs.db文件吗?

    我已经用VB实现了类似的功能。我的软件能够在大约10秒钟内生成100个文件(混合大小)的缩略图。

    但我无法将其转换为Delphi。