Delphi 用于大图像的TImagelist

Delphi 用于大图像的TImagelist,delphi,bitmap,Delphi,Bitmap,我想在表单上显示一组例如30个位图中的一个小数字。我在表单上放置了几个TImage组件,并在设计时加载了图像。现在,我想在表单开始时交换图像,同时将位图从TImagelist加载到Timage组件中。我失败了,因为Timagelist最多只能保存128 x 128像素的图像 问:如何制作大型图像的imagelist 我没有选择: 在启动期间从文件加载图像 放置40个Timages 在我的窗体上,使用TImage[i]显示正确的窗体。可见:=true 因此,您希望能够按需显示这30个位图中的任何一

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

问:如何制作大型图像的imagelist

我没有选择:

  • 在启动期间从文件加载图像
  • 放置40个Timages 在我的窗体上,使用TImage[i]显示正确的窗体。可见:=true
    因此,您希望能够按需显示这30个位图中的任何一个,但不希望在需要时从外部文件加载它们。我想这是因为您担心HDD性能会妨碍您足够快地显示这些图像

    我看到几个选择:

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


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


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


    现在,如果你不知道如何使用资源并且不愿意学习,你可以使用一些图像编辑软件将所有这些图像放到一个大图像中。然后,您可以在窗体上使用一个TImage控件,并在设计时设置该大图像集

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


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

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


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

    将它们添加为资源。此外,您可能希望切换到一些无损压缩图像格式,例如PNG,以使可执行文件的大小更小。像JediVCL/RxLib这样的库也有一个组件可以将文件保存在DFM中—您只需将其放到表单上即可。所以你可以用图片制作一个zip,然后把这个zip放到DFM中,在运行时你可以在循环中解压图片并加载它们,一个接一个地使用EXE资源也是可能的,但是这是一个更为手动的工作,这是另一个选项,但我认为它可能会极大地增加内存占用。图片列表是为按钮上的标志符号设计的,菜单等等,它们不是你需要的。链接一些png/jpg图像作为参考资料。他还可以使用JediVCL/RxLib的TJvDataEmbedded组件“将数据(zip存档)集成到DFM中”——只需将其放到表单上,单击它,然后将文件加载到ITI中,如果他使用JPEG/PNG/GIF或其他压缩格式,然后一次性加载所有数据(通过许多TBIMAP或TGrImageList)会使它们全部解压和扩展,这只是浪费内存。所以我更喜欢在DFM中使用zip,然后使用两个TBitmap/TImage组件和触发器方法,甚至可以将下一个图片加载过程卸载到一个额外的线程(异步调用或OTL)“现在通过复制大图像画布的一部分来显示所需的图像”&“Arioch在内部建议的Graphics32库的组件使用了非常类似的方法”我没有检查代码,但他们的wiki严厉地建议他们使用相反的方法