【问题标题】:TImagelist for large images大图像的 TImagelist
【发布时间】:2015-08-24 16:32:41
【问题描述】:

我想显示一组例如30 位图在一个表单上是一个小数字。我在这个表单上放置了几个 TImage 组件,并在设计时加载了图像。现在我想在表单开始时交换图像,同时将位图从 TImagelist 加载到 Timage 组件中。我失败了,因为 Timagelist 最多只能容纳 128 x 128 像素的图像。

问:如何为大图像制作图像列表?

我没有选择:

  1. 在启动过程中从文件中加载图像.....
  2. 放置 40 张图片 在我的表单上显示正确的 TImage[i].visible := true;

【问题讨论】:

  • 将它们添加为资源。此外,您可能希望切换到一些无损压缩图像格式,例如PNG 以使您的可执行文件更小。
  • JediVCL/RxLib 等库也有一个组件可以将文件保存在 DFM 中 - 您只需将其放到表单中即可。所以你可以用图片制作一个 zip,然后把这个 zip 放到 DFM 中,在运行时你可以循环解压缩图片并加载它们,一个接一个地使用 EXE 资源也是可能的,但是恕我直言,这需要更多的手动工作跨度>
  • 另一个选项graphics32.org/documentation/Docs/Units/GR32_Image/Classes/… 但我认为它可能会大大增加内存占用
  • 图像列表是为按钮、菜单等上的字形设计的。它们不是您所需要的。链接一些 png/jpg 图像作为资源。或者有外部文件。

标签: delphi bitmap


【解决方案1】:

因此,您希望能够按需显示这 30 个位图中的任何一个,但又不想在需要时从外部文件加载它们。我猜这是因为您担心 HDD 性能会妨碍您以足够快的速度显示这些图像。

我看到了几个选项:

第一个选项是将这些图像放在单独的文件中,然后在应用程序启动时将它们加载到多个 TBitmap 类中(每个图像一个 TBitmap)。然后,当您需要在表单上显示特定图像时,您只需将特定位图指定为您希望在其上显示该图像的所需 TImage 组件的图片源。


如果您不想为您的应用程序分发 30 多个文件,您可以将所有这些图像放入一个存档中,然后在应用程序启动时将它们加载到单独的位图类中,如上所述。


如果您只想为您的应用程序提供一个文件,那么您可以将这些图像放入一个资源文件中,然后将该资源文件构建到您的可执行文件中。完成后,您可以将所有这些图像作为资源访问。我认为有一个关于使用资源的问题不久前在 SO 上发布。


现在,如果您不知道如何使用资源并且不愿意学习,您可以使用一些图像编辑软件将所有这些图像合成一张大图。然后,您可以在表单上拥有一个 TImage 控件,并在设计时设置该大图像。

这会将图像数据直接集成到您的 DFM 中,由于 DFM 中的图像数据较大,这可能会导致表单创建速度稍慢。

您现在通过将部分大图像画布复制到所需 TImage 组件的画布上来显示所需的图像。事实上,您不再需要为这些使用 TImage 组件。任何带有画布的组件都可以。

最后一个选项类似于使用 Atlas Bitmap-ses,有时也类似于使用 Sprite 图像。

Arioch 内部建议的 Graphics32 库中的组件使用非常相似的方法。

【讨论】:

  • 他还可以使用 JediVCL/RxLib 的 TJvDataEmbedded 组件“在 DFM 中集成数据(zip 存档)” - 只需将其放在表单上,​​单击它,然后将文件加载到其中
  • 如果他使用 JPEG/PNG/GIF 或其他压缩格式,那么一次加载它们(通过许多 TBimap 或通过 TGrImageList)会使它们全部未压缩和扩展 - 只是浪费内存。所以我更喜欢使用 zip-in-DFM,然后使用两个 TBitmap/TImage 组件和触发器方法,甚至可能会将下一个图片加载过程卸载到一个额外的线程(AsyncCalls 或 OTL)
  • “您现在通过复制大图像画布的一部分来显示您想要的图像”和“Arioch 内部建议的 Graphics32 库中的组件使用非常相似的方法”我没有检查代码,但他们的 wiki强烈建议他们使用相反的
猜你喜欢
  • 2016-10-06
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多