1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| {-----------------------------------------------------------------------------
ICON EXTRACTOR
Petit extracteur d'icones
Ce programme attend en paramètre un nom de fichier d'icones valide, et
extrait vers le répertoire c:\ des icones simples contenant chacune des
images contenues dans le fichier de départ
Clandestino
-----------------------------------------------------------------------------}
Program IconExtractor;
{$Mode Delphi}
uses classes, sysutils;
type
// les icones commencent par 3 WORDS définis ainsi
TlazIconHeader = packed record
IdReserved : WORD; // fixe, toujours 0
IdType : WORD; // type de ressource pour un icone = 1
IdCount : WORD; // Nombre d'images
end;
// Puis suivent les definitions des images
// ceci étant répété le nombre de fois defini au dessus par idCount
TlazImageHeader = packed record
bWidth : BYTE; // Largeur, en pixels, de l'image
bHeight : BYTE; // Hauteur, en pixels, de l'image
bColorCont : BYTE; // Nombre de couleurs: =0 si >=8bpp
bReserved : BYTE; // fixe, toujours 0
wPlanes : WORD; // Nombre de 'colors planes' << pas compris,
// semble toujours égal à 1
wBitCounts : WORD; // bits per pixels
dwBytesInRes : DWORD; // Taille de l'image dans le fichier
dwImageOffset : DWORD; // Offset de debut de l'image dans le fichier
end;
// Puis suivent, aux adresses indiquées par dwimageoffset
// sur une taille de dwimageOffset
// les données des images
var
ImageHeader : TlazImageHeader ;
LIH : TlazIconHeader;
tfs : Tfilestream;
tms : TmemoryStream;
i:WORD;
begin
if paramcount >0 then begin
if fileexists(paramstr(1)) then begin
tfs:= tfilestream.Create(paramstr(1),fmopenread);
tms := tmemorystream.Create;
// on lit l'entete de fichier
tfs.Read(LIH, sizeof(LIH));
// Si c'est un icone
if LIH.IdType = 1 then begin
// une boucle pour toutes les images
for i:= 1 to LIH.IdCount do begin
tms.clear;
// on se place au début de l'entete de l'image i
tfs.Seek ((i-1)*sizeof(ImageHeader)+sizeof(LIH),sofrombeginning);
// on charge l'entete de l'image i
tfs.Read(ImageHeader, sizeof(ImageHeader));
// on se replace au début dans les deux streams
tms.Seek(0,sofrombeginning);
tfs.seek(0,sofrombeginning);
// on copie l'entete de fichier dans le stream temp
tms.CopyFrom(tfs,sizeof(LIH));
// on se place au debut de l'entete de l'image i
tfs.Seek ((i-1)*sizeof(ImageHeader),sofromcurrent);
// on copie cette entète dans le stream temp
tms.copyfrom(tfs,sizeof(ImageHeader));
// on se place à l'adresse du debut du data de l'image i
tfs.Seek(ImageHeader.dwImageOffset, sofrombeginning);
// on copie le data dans le stream temp
tms.CopyFrom(tfs,ImageHeader.dwBytesInRes);
tms.Seek($04,Sofrombeginning); // adresse du WORD nombre d'images
tms.WriteByte($01); // Patch = 1 image
tms.Seek($12,Sofrombeginning); // adresse du dword offset debut Data
tms.WriteDWord($00000016); // Patch = bonne adresse
tms.Seek(0,Sofrombeginning);
// il ne reste plus qu'à copier le resultat dans un fichier
// sur le disque
tms.SaveToFile('c:\'+inttostr(I)+'.ico');
end;
end else writeln('Ce fichier n''est pas un fichier icone valide');
tms.Free;
tfs.Free;
end;
end;
writeln(inttostr(I)+' fichiers crees dans c:\');
readln;
End. |
Partager