【问题标题】:How can I keep the size of a Delphi application small when it has many TImage components?当 Delphi 应用程序有许多 TImage 组件时,如何保持它的小?
【发布时间】:2014-07-07 09:54:03
【问题描述】:

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

如何制作一个包含成百上千张图片的应用程序,同时让 exe 体积小?

【问题讨论】:

    标签: delphi timage


    【解决方案1】:

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

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

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

    【讨论】:

    • 将图像文件作为二进制资源保存在 EXE 中可能很有用。那么EXE的大小会合理(因为压缩的图像格式)并且部署简单(因为它仍然是1个文件)。简单的例子在这里stackoverflow.com/questions/1153394/…
    • @AndreiGalatyn 这是真的。但是,如果图像在 .dfm 中为 10GB,那么无论您如何压缩它们,我认为您的可执行文件都会太大
    • ... .dfm 中包含的所有内容可能会让 IDE 变得非常慢,而且编译时间也很长。 exe 的增量更新将受益于外部映像。 +1
    • @David 您确定系统会尝试为整个 EXE 文件(包括二进制资源)保留地址空间吗?我认为它不会为 EXE 内的资源加载(保留地址空间等)。
    • 另外,如果多次使用同一张图片,则只需要该图片的一份副本,然后加载到所需的任何图片控件中。
    【解决方案2】:

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

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

    【讨论】:

    • 如果您不需要将图像保持在原始尺寸,这是一个相当大的假设。缩小,然后放大会导致质量下降。
    • 你是对的,这是一个很大的如果 - 抱歉我没有更清楚。 OP 没有告诉我们他打算如何使用这些图像。如果它们只是要在应用程序中显示,则可以将它们缩小到“显示”大小(例如 150x100 以获得一个不错的整数),与相机上的图像相比,可以大大节省内存需求,例如, 3000x2000。如果图像需要以原始大小呈现,那么我的第二个建议(缓存缩小的图像)将是一种可行的方法,只要有一种方法可以将缓存的图像与其原始大小相关联。
    • 您确实需要认识到您似乎忽略了的质量问题。
    • 再次,OP 没有告诉我们图像的意图。假设您指的是图像的质量,这取决于 OP 原始问题的性质。如果他只想将图像显示为缩略图,那么当您将全尺寸图像缩小为缩略图时,这些图像的质量将始终受到影响。我的缓存方法将允许他生成(和维护)缩略图,而不必破坏原件。只要您可以将缓存的图像与原始图像相关联(因此可以以完整质量显示它们),质量损失在哪里?
    • 对不起,大卫,我不是建议先缩小再放大。你说的很对,那样真的会适得其反。我打算创建的缩略图在批量显示时比全质量图像更节省资源;然后在需要时使用全质量图像。
    【解决方案3】:

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

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

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

    您可以在此处阅读更多内容: http://blogs.embarcadero.com/davidi/2013/11/23/43005/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 2020-12-12
      • 2020-09-18
      相关资源
      最近更新 更多