Transformer une image JPG en hexadecimal

cs_Peone Messages postés 16 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 12 mars 2006 - 8 févr. 2006 à 11:29
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 8 févr. 2006 à 23:16
Je suis en plein stage piur le moment et je bloque sur une chose.
Je dois inserer un jpg dans un fichier RTF (d'ou le fait qu'il me faut de l'hexa)
Y-t-il possibilite en delphi de transformer ce JPG en hexadecimal pour pouvoir copier ca dans mon rtf

Merci a ceux qui me repondront

Peone

3 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
8 févr. 2006 à 21:45
Bien sûr que c'est possible. Pour cela, nous utilisons les streams et la fonction IntToHex.

{Convertit le flux Stream en une chaine composée
de caractères hexadécimaux}
function ConvertToHex(Stream: TStream):string;
var
  Buffer: byte;
begin
  Result :=  EmptyStr;
  //Recale le flux au début
  Stream.Seek(0, soFromBeginning);
  //lecture de chaque octet dans le flux
 while  Stream.Read(Buffer, 1)  = 1do
//transformation en caractères hexadécimaux
    Result :=  Result + IntToHex(Buffer, 2);
 end ;

procedure TForm1.Button1Click(Sender: TObject);
var
  Stream: TMemoryStream;
  S: String;
begin
//création d'un flux en mémoire
  Stream : = TMemoryStream.Create;
  try
//enregitrer l'image dans le flux
    Image1.Picture.Graphic.SaveToStream(Stream);
    //Conversion du flux
    S :=  ConvertToHex(Stream);
    {Ecrire la chaine résultante dans un TMemo}
    Memo1.Lines.BeginUpdate;
    Memo1.Text := S;
    Memo1.Lines.EndUpdate;
  finally
    Stream.Free;
   end ; {try..finally}
end;

C'est amusant, mais j'ai rencontré le même problème...

<HR color =#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
cs_Peone Messages postés 16 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 12 mars 2006
8 févr. 2006 à 22:29
un grnad merci, c'est comme ca que j'y suis arrive mais avec un code un peu plus simple

repeat
begin
ReadLn(Lecteur,Ligne);
If ligne<>'' then //si la ligne est vide, lors du split, tabMot est vide ==> plante lors du test
begin
Split('[',Ligne,tabMot);
if tabMot[0]='\includegraphics' then
begin
Ligne:=tabMot[1]; //ici tabMot[1]= scale=0.5]{SkinSp.JPG}
Split('{',Ligne,tabMot);
//tabMot[0]=scale=0.5] et [1]=SkinSp.JPG}
Split('}',tabMot[1],NomFichier); //enleve le } a la fin du string
showmessage(NomFichier[0]);


FichierImage := FileOpen(NomFichier[0],fmOpenRead);


size := FileSeek(FichierImage,0,2);
FileSeek(FichierImage,0,0);
//FileSeek(Ecrivain,DebutImageHexa,0);
while size > 0 do
begin
len := FileRead(FichierImage,buffer,sizeof(buffer));
For i := 0 to len-1 Do
Begin
LigneEnHexa:=LigneEnHexa+IntToHex(Ord(buffer[i]),2);
End;
size := size - len;
Writeln(Ecrivain,LigneEnHexa);
LigneEnHexa:='';
end;


FileClose(FichierImage);
end;
end ;
end;
until EOF(Lecteur);

le seul prob c que je genere un rtf bien lu par word et openoffice mais wordpad est moins d'accord


Peone
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
8 févr. 2006 à 23:16
Le niveau du RTF supporté par WordPad est bien en dessous de celui supporté par Microsoft Word.
Cela dit, je trouve ton code bien compliqué mais il y a surement des raisons à cela.
Si tu ne veux pas passer par un TImage, tu peux utiliser un TJepgImage directement et sa méthode LoadFromFile avant de lancer la conversion en hexadécimal.

procedure TForm1.Button1Click(Sender: TObject);
var
  Stream: TMemoryStream;
  S: string;
  jpeg: TJpegImage;
begin
//cr&#233;ation d'un flux en m&#233;moire
  Stream :=  TMemoryStream.Create;
  try
    jpeg := TJPegImage.Create;
    try
      jpeg.LoadFromFile('MonImage.jpg');
      jpeg.SaveToStream(Stream);
      //Conversion du flux
      S := ConvertToHex(Stream);
      {Ecrire la chaine r&#233;sultante dans un TMemo}
      Memo1.Lines.BeginUpdate;
      Memo1.Text := S;
      Memo1.Lines.EndUpdate;
    finally
      jpeg.Free;
     end ; {try..finally}
finally
    Stream.Free;
  end; {try..finally}
end;

L'utilisation des streams est diablement efficace.

Si tu as un code plus simple, je suis preneur

<HR color =#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
Rejoignez-nous