如何在WinForms应用程序的单个文件中存储大量图像?

时间:2009-05-05 22:37:50

标签: .net winforms image filesystems

我有一个.net WinForms 2.0应用程序,目前有大约3000个图像的图像库。目前我正在使用SQLite并将所有图像存储为具有唯一ID的BLOB,以便于检索。

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

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

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

此外,您可以将图像移动到Web服务器上并让客户端在本地缓存图像,然后让客户端定期检查更新的图像,这样只需要所需的图像下载。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

根据您的具体情况,可能会出现自定义ISAM类型文件。

整体文件布局为:

----------------
| Count  | int |
----------------
| Index  |
----------
| Images |
----------

索引格式

----------------
| offset | int |
----------------
| size   | int |
---------------------------
| description  | char(50) |
---------------------------
|  id    | int |
----------------

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

此格式的缺点是替换现有图片需要重建文件。

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

(如果你把索引保存在RAM中,这种疯狂方法的一个好处就是访问速度。)