2009-05-05 7 views
1

Ich habe eine .net WinForms 2.0-Anwendung, die derzeit eine Bildbibliothek von etwa 3000 Bildern hat. Zur Zeit verwende ich SQLite und speichere alle Bilder als BLOBs mit eindeutigen IDs, die das Abrufen erleichtern.Wie kann ich viele Bilder in einer einzigen Datei für eine WinForms App speichern?

Der Vorteil ist, dass die Endbenutzer sich keine Sorgen machen müssen, dass der Installer einen riesigen Bilderblock auf ihrem Computer entpackt, und wenn Updates gemacht werden, kann ich eine einzige Datei für den Download des Benutzers rausschicken ist eine frische Kopie von allem. Die Dateien sind tendenziell eher groß (derzeit ~ 60 Megabyte), aber die Endbenutzer sind daran gewöhnt und die Anwendung hat auch einen "Kein Bild" -Modus für diejenigen, die sich einwählen.

Der einzige Nachteil an all dem ist, dass die Erstellung der Bibliothek manchmal ein wenig schwierig sein kann. Die Daten müssen in das Binärformat konvertiert werden, ich muss sicherstellen, dass die entsprechenden IDs richtig verknüpft sind. Der Job, der die Bibliothek generiert, dauert ebenfalls eine Weile.

Ich bin dabei, die Anwendung zu aktualisieren, und ich frage mich, ob es einen besseren Ansatz dafür gibt. Ich möchte immer noch den Single-File-Ansatz beibehalten, um Updates an Benutzer zu senden und den Footprint auf dem Computer kleiner zu halten. Gibt es eine Art "portables Dateisystem" oder eine Ressourcenbibliothek, die ich verwenden/erstellen kann, die es mir erlauben würde, Bilder einfach von dort einzufügen/abzurufen, ohne notwendigerweise eine Datenbank zu haben, mit der die Anwendung interagieren kann?

+0

Was sind die Bilder? Benutzerdaten oder Anwendungsressourcen?Warum können sie nicht als Ordner mit Bildern auf der Festplatte oder sogar als optionales Add-In-Installationsprogramm bereitgestellt werden? –

+0

Anwendungsressourcen. Ein Benutzer ruft Details auf einer Karte aus der Master-Datenbank ab, und das entsprechende Bild wird aus dem anderen Bild gezogen. Ich möchte vermeiden, einen Ordner mit Bildern zu haben, wenn es hilft, die Gesamtanzahl der Dateien der Anwendung minimiert zu halten. Zuvor gab es einige Bedenken hinsichtlich des Missbrauchs der Bilder selbst (lange Geschichte), so dass sie auch in diesem Sinne geschützt wurden. –

+0

Egal, welche Methode Sie verwenden, Sie werden nicht verhindern, dass Benutzer die Bilder verwenden. Das ist die eine Lektion, die DRM uns gelehrt hat. Wenn es Ihr Hauptanliegen ist, die Verbreitung von Dateien zu minimieren, ist eine ZIP-Datei eine gute Lösung. –

Antwort

3

Eine Resx-Datei (kompiliert zu einer Ressource-DLL)? Oder einfacher - eine Zip-Datei? Vielleicht mit #ZipLib.

+0

Wenn ich eine Zip-Datei verwenden würde, wäre ich in der Lage, selektiv eine Image-Datei zu extrahieren, ohne das gesamte Archiv dekomprimieren zu müssen? –

+0

Ja, Sie können nur extrahieren, was Sie brauchen. –

+1

Ja - ein Zip-Archiv hat im Wesentlichen eine Datei-Header-Tabelle, mit der Sie Dateien einzeln extrahieren können - oder zumindest diejenigen übergehen, die Sie nicht möchten. Die #ziplib-Beispiele zeigen alles oder einige davon - es ist nicht sehr schwierig. –

0

7zip haben auch eine Bibliothek, die Sie auch nutzen könnten, sehen this

Auch Sie könnten die Bilder bewegen, um einen Web-Server bedient werden ausgeschaltet und haben den Client-Cache das Bild lokal, und dann einen Weg des Kunden haben Wenn Sie regelmäßig nach einem aktualisierten Bild suchen, müssen nur die erforderlichen Bilder heruntergeladen werden.

Sie können auch lo-res-Versionen für DFÜ-Benutzer haben.

0

Ich habe die ImageList-Steuerelement und AddStrip-Methoden in ähnlichen Situationen verwendet. Ich habe dann eine riesige PNG-Datei, die alle Bilder enthält. Das ist großartig für Icons, wird aber nicht gut für andere Arten von Ressourcen funktionieren.

0

Je nach Ihren Umständen ist eine benutzerdefinierte ISAM-Datei möglich.

Das gesamte Datei-Layout wäre:

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

Index Format

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

Die Zahl eine ganze Zahl, welche die Anzahl der Bilder in der Datei sein würde. Der Index würde Paare (Versatz, Größe) enthalten, die den Versatz in die zu suchende Datei beschreiben, und die Anzahl der zu lesenden Bytes beginnend bei diesem Versatz.

Ein Nachteil dieses Formats ist, dass das Ersetzen eines vorhandenen Bilds die Datei neu erstellen müsste.

Metadaten mit fester Länge wie Beschreibungen und IDs können in der Kopfzeile platziert werden.

(Vielleicht ein Kopf dieser Methode des Wahnsinns ist die Geschwindigkeit des Zugriffs, wenn Sie den Index im RAM halten.)

Verwandte Themen