EDIT : le Temps que j'écrive ma solution Clorish est intervenu, en fait je pense que j'ai expliqué la même chose ...
Plein d'image BMP dans un fichier, tu veux te simplifier la vie, cherche des composants ZIP pour Delphi, et tu gères des images dans le Zip, l'avantage, c'est que ces composants fournissent en général des functions pour Stream idéal pour un chargement dans un TImage..., ...
Sinon, la solution manuelle, tu as un fichier, voici une structure d'exemple (es-tu à l'aise avec le FileStream, ou la fonction BlockRead, ainsi que la lecture de données binaires et non Texte ?)
Le Fichier
Un Entier = Le Nombre d'Image
Une série de Structure TArdelyIndex qui contient
Un Entier = Le Numéro de l'Image
Un Entier = Offset dans le Fichier de l'Image
Un Entier = Taille de l'Image en Octet
Une Chaine[255] = Nom du Fichier
Ensuite, qui du binaire, les BMP ...
Pour lire tu charges dans un Tableau of TArdelyIndex (taille défini par le Nombre d'Image), cela donne en gros
1 2 3 4 5 6
| MonStream.Read(LeNombreImage, 4);
SetLength(MesImagesInfos, LeNombreImage);
for i := 1 to LeNombreImage do
begin
MonStream.Read(MesImagesInfos[i], SizeOf(TArdelyIndex));
end; |
1 2 3 4 5 6
| TArdelyIndex = packed record
ID: Cardinal;
Offset: Cardinal;
BMPSize: Cardinal;
Title: ShortString[255];
end; |
Ensuite tu veux lire l'image numéro 32 (disons que le numéro et l'index dans le tableau sont confondus), par de soucis
1 2 3 4
| MemoryStream.Size := MesImagesInfos[32].BMPSize;
MonStream.Seek(MesImagesInfos[32].Offset, FromBeginning);
MonStream.Read(MemoryStream.Memory, MesImagesInfos[32].BMPSize);
MonImage.LoadFromStream(MemoryStream); |
Pour écrire, c'est plus compliqué, il faut soit tout réécrire à chaque coup, soit géré l'index de façon plus poussé (dans un second fichier ou laisser de la place pour ajouter des index avant de devoir déplacer les blob) ... je dirais que c'est un objet, que si j'avais le temps (taf taf), je l'aurais bien écrit pour toi, J'ADORE les SUSHI, euh non le traitement de Fichier ...
En Gros lire un Entier ça donne
MonStream.Read(UnEntier, 4);
ou encore
BlockRead(MonFichier, UnEntier, 4);
Partager