【问题标题】:How can I store lots of images in a single file for a WinForms app?如何为 WinForms 应用程序在单个文件中存储大量图像?
【发布时间】:2009-05-05 22:37:49
【问题描述】:

我有一个 .net WinForms 2.0 应用程序,它目前有一个包含大约 3000 个图像的图像库。目前我正在使用 SQLite 并将所有图像存储为具有唯一 ID 的 BLOB,这使得事情变得容易检索。

这样做的好处是最终用户不必担心安装程序会在他们的计算机上解压缩大量图像,并且在进行更新时,我可以推出一个文件供用户下载一切的新副本。文件往往相当大(目前约为 60 兆),但最终用户已经习惯了,并且该应用程序还为拨号用户提供了“无图像”模式。

所有这一切的一个缺点是生成库有时会有点棘手。数据必须转换为二进制格式,我必须确保相应的 Id 正确链接。生成库的作业也需要一段时间才能运行。

我正在升级应用程序,我想知道是否有更好的方法来执行此操作。我仍然希望保留单一文件方法,以便于向用户发送更新并保持计算机上的占用空间更小。是否有某种“便携式文件系统”或资源库可供我使用/创建,让我可以轻松地从中插入/检索图像,而不必让应用程序与之交互的数据库?

【问题讨论】:

  • 图片是什么?用户数据或应用程序资源?为什么不能将它们部署为硬盘上的图像文件夹,甚至作为可选的插件安装程序?
  • 应用程序资源。用户从主数据库中提取卡片的详细信息,并从另一个图像中提取相应的图像。如果可以帮助将应用程序的总文件数降至最低,我想避免使用图像文件夹。以前对图像本身的滥用存在一些担忧(长话短说),因此在这个意义上保护它们也得到了解决。
  • 无论您使用什么方法,您都不会阻止用户(ab)使用图像。这是 DRM 教给我们的一课。如果您主要关心的是尽量减少文件的扩散,那么 ZIP 文件是一个很好的解决方案。
  • 是的,这就是我所在的位置。我知道过去曾发生过滥用行为,但更多的是“尽职调查”游戏,更重要的是,如果我忍不住将 3000 多个文件爆炸到用户的机器上。

标签: .net winforms image filesystems


【解决方案1】:

resx 文件(编译为资源 dll)?或者更简单 - 一个 zip 文件?也许使用#ZipLib。

【讨论】:

  • 如果我使用 zip 文件,我是否能够有选择地提取图像文件而无需解压缩整个存档?
  • 是的,你可以只提取你需要的东西。
  • 是的 - 一个 zip 存档本质上有一个文件头表,允许您单独提取文件 - 或者至少跳过那些您不想要的文件。 #ziplib 示例显示了全部或部分内容 - 这不是很棘手。
  • 您知道 resx 与 zip 文件相比有什么好处吗?我仍在权衡差异。
  • 好吧,你可以在 VS 中维护它,并且相当容易地将它国际化 - 但我想知道 zip(作为更简单的选项)是否更容易实现。特别是,编辑 zip 内容更容易。
【解决方案2】:

7zip 还有一个你也可以使用的库,请参阅this

您还可以将要提供的图像移出网络服务器并让客户端在本地缓存图像,然后让客户端定期检查更新的图像,这样就只需要提供所需的图像已下载。

您还可以为拨号用户提供低分辨率版本。

【讨论】:

    【解决方案3】:

    我在类似的情况下使用了 ImageList 控件和 AddStrip 方法。然后我有一个包含所有图像的巨大 PNG 文件。这对图标非常有用,但不适用于其他类型的资源。

    【讨论】:

      【解决方案4】:

      根据您的具体情况,可以使用自定义 ISAM 类型文件。

      整体文件布局如下:

      ---------------- |计数 |整数 | ---------------- |索引 | ---------- |图片 | ----------

      索引格式

      ---------------- |偏移 |整数 | ---------------- |尺寸 |整数 | -------------------------- |描述 |字符(50) | -------------------------- |编号 |整数 | ----------------

      计数将是一个包含文件中图像数量的整数。索引将包含 (offset, size) 对,描述文件中要查找的偏移量以及从该偏移量开始读取的字节数。

      这种格式的一个缺点是替换现有图片需要重新构建文件。

      可以将描述和 ID 等固定长度的元数据放在标题中。

      (如果您将索引保存在 RAM 中,这种疯狂方法的一个优点可能是访问速度。)

      【讨论】:

        猜你喜欢
        • 2021-06-26
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 2016-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-04
        相关资源
        最近更新 更多