Dfm reader

Description

Cette source lit une image à partir d'une source DFM ( "je pense que ça veux dire: Delphi Form File" :p) bien sure vous pouvez utiliser les pointeurs ou de ASM (pour optimiser le code) moins de variables... fait ce que vous voulez, moi personnellement j'ai pas le temps de faire ça déja j'ai fais cette source juste en break time pour un ami qui a bc chercher sur le net et rien trouvé alors je pense que ça sera utile pour bc de gens.

bon! pour les DFM je pense que le delphi enregistre tous format que soit image jpeg icon ou tous autre format d'image en bitmap.
j'explique un peut plus,
si on utilisent un Timage pour enregistrer un image par exemple ; les données de cette image sont enregistrer dans le ficher DFM (Fichier ASCII) dans le Block qui situe entre "Picture.Data = {" jusqu'au prochaine "}" sous format de chaine en Hexadécimale, et il écrit le type de format original dans les 24 premiers bites genre (075 7D..bal bla) pour l'identifier format original "TJPEG ou TBITMAP" ou cas ou vous voulez récupérer ce que vous appartiens bien sure :D!, tous format bitmap commence par 42 4D = M B c a dire format bitmap (pour tester et ouvrer une bitMap avec un éditeur Hex pour voire, d'ailleurs c le cas de tous les fichier non ASCII, alors il ne reste que de récupérer tous block de donnée entre 42 4D jusqu'au prochaine "}" et convertir le code hex en byte puis les récupérer dans un Tstream et le reste n'est pas très dure a faire, ben! pour la plupart des collègues.

Source / Exemple :


//********Notre Procedure de conversation modifier 
//********Origine http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_20438223.htm
procedure HexStr2Bmp(Astring:Ansistring);
var
BmpStream: TMemoryStream;
Bmp1: TBitmap;
i: Integer;
Mystr:string;
begin
 showmessage('Size: '+floattostr((Length(Astring)/2))+' Octs');
if Length(Astring) mod 2 <> 0 then  //**on teste si c'est une valide bitmap
  Begin              //** (if is a valide Hex Code bitmap)******
  ShowMessage('Not Even');
  Exit;
  end;
BmpStream := TMemoryStream.Create;
//******on calcule le volume de notre stream (Stream size fom length code)
BmpStream.Size := Length(Astring) div 2;

for i := 0 to (Length(Astring) div 2)-1 do
 begin
 mystr:=Copy(Astring,((i+1)*2)-1,2);
 mystr:=trim(Mystr);
 //****assigne our byte in stream (on ajout nos byte calculer au steam)
PByteArray(BmpStream.Memory)[i] := StrToInt('$'+Mystr);

 end;
 //**Revenir au debut de stream
 BmpStream.Position:=0;
//form1.edit1.text := IntToHex(PByteArray(BmpStream.Memory)[0],2);  // ça vous donne 42=debut bitmap correct car 42,4D=B M
try
Bmp1 := TBitmap.Create;
BmpStream.Position := 0;
Bmp1.LoadFromStream(BmpStream);
FDFMREADER.Image1.canvas.Draw(0,0,Bmp1);
bmp1.SaveToFile('temps1.bmp');
finally
Bmp1.Free;
BmpStream.Free;
end;

//**************************************
procedure TFDFMREADER.ReadDFM(Filenamee:string);
label 1;
Var
ReadString:TStringList;
linee,wordd:string;
I, Llength:integer;
 texte:Ansistring;
begin
//****je vai pas parler de creation car tous le monde vas le savoir un jour
ReadString:=TStringList.create;
//********************************************
ReadString.LoadFromFile(filenamee);
pb1.Max:=ReadString.Count;
i:=0;

//*****on vas chercher notre "Picture.Data = { " ou se trouve le Block de donnée de bitmap
//*****search  "Picture.Data = { " the Block of bitmap hex code

while (i < ReadString.Count-1)  do
begin
 inc(i) ;
wordd:='';
linee:=readstring[i];
linee:=trim(linee);
wordd:=copy(linee,0,7);
if lowercase(wordd)='picture' then
while  (linee <> 'end') do
begin
 inc(i);
 //**********to be freeeeeeeee*********
 application.ProcessMessages;
linee:=readstring[i];
linee:=trim(linee);
Llength:=length(linee);
//****"{" it mean the end of Block data"
if copy(linee,Llength,1)='}' then
begin
linee:=copy(linee,0,Llength-1) ;
memo1.Lines.Add(linee);
 pb1.Position:=i;
 goto 1;
end else
memo1.Lines.Add(linee);
  pb1.Position:=i;

end;

end;

1: begin
texte:='';
Edit1.Text:=copy(memo1.lines.Text,24,24);
 memo1.Lines.Text:=copy(memo1.lines.Text,25,length(memo1.Lines.Text));
//******** HEX CODE saint*****clean our result*********
 for i:=0 to memo1.Lines.Count-1 do
texte:=texte+trim(memo1.Lines.Strings[i]);
HexStr2Bmp(texte); //**********Here the Procedure************
end;
end;

Conclusion :


Conclusion tous personne désire de faire un composant pour u charger des fichier sans utiliser les ressources RES DCR de delphi directemnt dans votre Executaple pour faire des installers par exemple, c le moment de la même façon que Delphi enregistre les donnée de bitmap dans un fichier ASCII (.DFM) .

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.