当Delphi应用程序有许多TImage组件时,如何保持其较小的大小?

当Delphi应用程序有许多TImage组件时,如何保持其较小的大小?,delphi,timage,Delphi,Timage,我想用Delphi做一个应用程序。问题是我将有很多TImage组件在其中-这将使exe的大小非常大。到目前为止,我的exe是20MB大,我只完成了主页,根据我的计算,exe本身的大小将超过10GB,这是太多了 如何制作一个包含数百/数千张图像的应用程序,同时又能让exe文件变小?不要将图像放在可执行文件中。将它们保存在外部文件中,并在运行时加载它们 这将要求您在设计时停止将图像加载到TImage控件中,而是使用动态代码加载图像,并传输到TImage控件。这样做有很多好处: 您可以将可执行文件的大

我想用Delphi做一个应用程序。问题是我将有很多
TImage
组件在其中-这将使exe的大小非常大。到目前为止,我的exe是20MB大,我只完成了主页,根据我的计算,exe本身的大小将超过10GB,这是太多了


如何制作一个包含数百/数千张图像的应用程序,同时又能让exe文件变小?

不要将图像放在可执行文件中。将它们保存在外部文件中,并在运行时加载它们

这将要求您在设计时停止将图像加载到
TImage
控件中,而是使用动态代码加载图像,并传输到
TImage
控件。这样做有很多好处:

  • 您可以将可执行文件的大小控制在合理的范围内,以适应虚拟地址空间
  • 您可以对图像使用最合适的压缩格式。如果我没有记错的话,Delphi
    TImage
    将以一种非常低效的方式保存到.dfm文件中。您可以选择使用PNG或JPEG压缩
  • 将文件保存在外部可以让您在开发时更好地管理它们。可以将它们作为单独的文件保存在版本控制系统中。将图像存储在.dfm文件中有助于在需要更改图像时进行艰苦的更新。您必须与IDE进行大量交互。存储为文件允许您覆盖文件并提交到存储库

  • 如果您不需要保持图像的原始大小,您可以在程序启动时读取图像并将其缩放到“工作”大小。这将大大降低您的内存需求—例如,将图像的宽度和高度减少到原始图像的一半,将内存需求减少到原始图像的四分之一


    如果映像没有更改,您可以在单独的构建过程中脱机执行此操作,并大大减少加载时间。否则,您可以在加载过程中缓存缩减后的图像,以便在下次启动程序时加快速度。

    您可能会发现二进制代码将所有图像都作为PNG文件格式包含在内,因此它将非常适合您的应用程序大小

    我在运行时使用图像作为JPG,因此在表单的
    OnCreate
    事件中可以从包中加载

    使用“项目”菜单“部署”将您的JPG文件包括到APK中

    您可以在此处阅读更多内容:

    将图像文件作为二进制资源保存在EXE中可能很有用。然后EXE的大小将是合理的(因为压缩的图像格式)和简单的部署(因为它仍然是一个文件)。这里有一个简单的例子@AndreiGalatyn,这是真的。然而,如果图像在.dfm中是10GB,无论你如何压缩它们,我认为你将有太大的可执行文件。。。而且.dfm中包含的所有内容都会让IDE变得非常慢,编译时间也非常长。exe的增量更新将受益于外部图像+1@David您确定系统会尝试为整个EXE文件(包括二进制资源)保留地址空间吗?我认为它不会为EXE中的资源加载(保留地址空间等)。此外,如果同一个映像被多次使用,则只需要该映像的一个副本,然后加载到需要的映像控件中。如果不需要将映像保持在其原始大小,则是一个相当大的if。缩小规模,然后再扩大规模会导致质量下降。你是对的,这是一个很大的如果-对不起,我没有更清楚。OP没有告诉我们他打算如何使用这些图像。如果它们只是简单地显示在应用程序中,那么它们可以缩小到“显示”大小(比如150x100表示一个漂亮的整数),与3000x2000的相机图像相比,可以大大节省内存需求。如果图像需要以其原始大小呈现,那么我的第二个建议(缓存缩小的图像)将是一个不错的选择,只要有一种方法将缓存的图像与其原始图像关联起来。您确实需要认识到质量问题,尽管您似乎忽略了这一点。再次,OP没有告诉我们这些图片的意图。假设您指的是图像的质量,这取决于OP原始问题的性质。如果他只是希望将图像显示为缩略图,当您将全尺寸图像缩小为缩略图时,这些图像的质量将始终受到影响。我的缓存方法将允许他生成(并维护)缩略图,而无需销毁原件。只要你能将缓存的图像与原始图像联系起来(并因此能以完全质量显示它们),质量损失在哪里?对不起,David,我不是建议先缩小然后再放大。你说得很对,那真的会适得其反。我打算的方法是创建缩略图,在批量显示时,它比全质量图像更节省资源;然后在需要时利用全质量图像。