Coder une image dans un fichier texte [Résolu]

Signaler
Messages postés
137
Date d'inscription
dimanche 7 juillet 2002
Statut
Membre
Dernière intervention
11 janvier 2009
-
Messages postés
3
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
21 février 2008
-
Bonjour,

J'aimerais savoir comment ecrire et lire le contenu d'une image dans/depuis un fichier texte.
Après avoir crée une image dynamiquement, je souhaiterais l'enregistrer dans un fichier texte pour pouvoir par la suite la réouvrir en lisant ce même fichier.

Si quelqu'un a une idée...

Merci
Orélien.

19 réponses

Messages postés
137
Date d'inscription
dimanche 7 juillet 2002
Statut
Membre
Dernière intervention
11 janvier 2009

Merci beaucoup, ça fonctionne très bien chez moi .
Les temps de conversions semble rapide.

Merci

Orélien.
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012
1
Bonsoir,

En codant par exemple ton image en base 64 (codage MIME). Cette méthode est couramment employée dans les newsgroups pour transférer des données binaires de façon "lisible".

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein

Salut,

Attention l'encodage en Bas64 augmente la taille du fichier d'un quart de sa valeur (Si 10 ko il ferat 12,5ko).

Exemple de fonction :

Function Base64Encode(S1: TStream) : string;
const
Code64: string[64]=('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/');
var
  Sg,Str: string;
  N, J: Integer;
  B: array[1..3] of Byte;
const
  LinLen = SizeOf(B)* 20;
begin
while S1.Position < S1.Size do
  begin
    N:= 0;
    Sg:= '';
      while (N < LinLen) and (S1.Position < S1.Size) do
        begin
          J:= S1.Size-S1.Position;
          if J > SizeOf(B) then
          J:= SizeOf(B);
          Inc(N, J);
          S1.ReadBuffer(B, J);
          Sg:= Sg+ Code64[(B[1] shr 2)+1];
          Sg:= Sg+ Code64[(B[1] and $03) shl 4 + (B[2] shr 4)+1];
          if J > 1 then Sg:= Sg+ Code64[(B[2] and $0F) shl 2 + (B[3] shr 6)+1]
                   else Sg:= Sg+ '=';
          if J > 2 then Sg:= Sg+ Code64[(B[3] and $3F)+1]
                   else Sg:= Sg+ '=';
        end;
    Str:=Str+Sg;
    end;
Result:=Str;
end;

Procedure Encode_Image(ImageName,TextName : String);
Var
FS : TFileStream;
TextFile:TStringList;
Begin
FS:=TFileStream.Create(ImageName,fmOpenRead);
TextFile:=TStringList.Create;
 Try
   TextFile.Text:=Base64Encode(FS); 
    TextFile.SaveToFile(TextName);
  Finally
  TextFile.Free; 
  FS.Free;
  End;
End;
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
et pourquoi pas la methode simple ? :

procedure SauverLimage(LImage: TImage; NomFichier: String);
begin
  monImage.picture.SaveToFile(NomFichier);
end;

procedure ChargerLimage(LImage: TImage; NomFichier: String);

begin

  monImage.picture.LoadFromFile(NomFichier);

end;

 
 

Pourquoi pas la méthode simple ? En enregistrant un bitmap au fichier on texte, on le bousille. Le savetofile('C:\MonImage.txt') va fonctionner mais le loadfromfile('C:\MonImage.txt') va planter

Evidemment j'ai vérifié la réponse
Messages postés
3815
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
4 août 2020
35
Salut,

Hola ... Le fait de changer l'extension du fichier ne va rien modifier dans la structure du fichier, il reste le même.
Par contre à la lecture il va planter ... mais pas à cause de la structure du fichier mais à cause de l'extension.

En effet la fonction qui se charge de lire le fichier contrôle d'abord l'extension, si celle ci n'est pas du format attendu il déclenche une erreur.

Et pour corriger ce problème il suffit de changer l'extension .TXT en .BMP (pour un bitmap bien sûr)

 
@+
Cirec

<hr siz="" />

Hé hé : j'ai fais un test hier soir Cirec.

J'ai ouvert un ficher bitmap avec le blocnote je l'ai enregistré sous un format txt. J'ai supprimé l'image réouvert le fichier texte et enregistré sous un format bmp. Tu sais quoi ? le fichier c'est crouté

Hormis ce beug dans windows , tu as totalement raison ca ne change pas le fichier.

Je me suis mal exprimé : si tu changes l'extension ton fichier il est plus utilisable tel quel, donc il est plus "utilisable" donc ca revient à le bousiller.

Mais je vois pas trop l'intéret de le metter au format txt : ca prend la meme place.
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
salut,

je suppose qu'il veux/doit passer le fichier à un endroit qui n'accept que les fichiers text pure. (ce qui était le premier but de l'encodage b64: passer les server qui ne suportaient que l'asci 7bits.)
par exemple un xml?

sinon, je ne vois pas l'intérêt non plus.

A+

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
bon bah alors en passant par un stream, il decrait pas poser de probleme sur l'extension

procedure SauverLimage(LImage: TImage; NomFichier: String);
var
  s: TFileStream;
begin
  s := TFileStream.Create(NomFichier, fmOpenWrite);
  monImage.picture.Bitmap.SaveTostream(s);
  s.Free;
end;

procedure ChargerLimage(LImage: TImage; NomFichier: String);
var

  s: TFileStream;

begin

  s := TFileStream.Create(NomFichier, fmOpenRead);
  monImage.picture.Bitmap.LoadFromStream(s);
  s.Free;
end;
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012
1
Ce qui serait plutot pas mal, c'est que l'interessé se manifeste ! Histoire de savoir où l'on en est...
Donc, Orelien
 qu'est ce que tu penses de tout ça ?

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
Sa question date d'hier 21h, faudrait pt'etre lui laisser le temps de rentrer chez lui quand meme ;)
Messages postés
137
Date d'inscription
dimanche 7 juillet 2002
Statut
Membre
Dernière intervention
11 janvier 2009

Bonsoir,

Merci également de vos réponses.

WhiteHippo (pas besoin de le mettre en gras ), désolé de ne pas avoir répondu plus tôt, question d'emploi du temps.
J'ai pu testé les procedure de Guillemouze qui fonctionne chez moi, mais pour ce qui est de l'encodage en base64 je n'arrive pas à l'exploiter .

Effectivement, on souhait est de passer le codage texte d'une image dans un fichie xml puor ensuite pouvoir le réexploiter en lisant son contenu dont l'image.

En tous les cas merci de votre aide.

Orélien.
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
salut,

l'encodage 64 est un sujet connu (et vieux). tu ne devrait pas avoir de problème à trouver un code d'exemple.
Pour faire tes tests, regarde bien les cas ou tu doit compléter avec des "=". c'est la seul difficulté.

bon code!

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
Messages postés
137
Date d'inscription
dimanche 7 juillet 2002
Statut
Membre
Dernière intervention
11 janvier 2009

Bonsoir,

J'ai utlisé le code de Guillemouze combiné à celui de Francky23012301 par ex. et tout fonctionne bien mais le souci est que en fonction de l'image, le traitement base64 peut parfois durer assez longtemps

Quelqu'un aurait-il une solution plus rapide en terme d'encodage/decodage d'image ?
Merci

Orélien.
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012
1
Bonsoir

Code realisé TROP rapidement (donc sans aucune garantie ). Testé sur un fichier JPG de plus de 2Mo. Temps de conversion plutôt courts.

const
  Codes64 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/';



function Encode64(S: string): string;
var
  i: Integer;
  a: Integer;
  x: Integer;
  b: Integer;
  w: Integer;
begin
  Result := '';
  w := 0;
  a := 0;
  b := 0;
  SetLength(Result,2*Length(s)) ;
  for i := 1 to Length(s) do
  begin
    x := Ord(s[i]);
    b := b * 256 + x;
    a := a + 8;
    while a >= 6 do
    begin
      a := a - 6;
      x := b div (1 shl a);
      b := b mod (1 shl a);
      inc(w);
      Result[w]:=Codes64[x + 1];
    end;
  end;
  if a > 0 then
  begin
    x := b shl (6 - a);
    inc(w);
    Result[w]:=Codes64[x + 1];
  end;
  SetLength(Result,W);
end;



function Decode64(S: string): string;
var
  i: Integer;
  a: Integer;
  x: Integer;
  b: Integer;
  w: integer;
begin
  Result := '';
  w := 0 ;
  a := 0;
  b := 0;
  SetLength(Result,2*Length(s)) ;
  for i := 1 to Length(s) do
  begin
    x := Pos(s[i], codes64) - 1;
    if x >= 0 then
    begin
      b := 64 * b + x;
      a := a + 6;
      if a >= 8 then
      begin
        a := a - 8;
        x := b shr a;
        b := b mod (1 shl a);
        x := x mod 256;
        inc(w);
        Result[w]:=chr(x);
      end;
    end
    else
      Exit;
  end;
  SetLength(Result,W);
end;



Procedure Encode_Image(ImageName,TextName : String);
Var
  FS,FR : TFileStream;
  S, SR : string ;
Begin
  FS:=TFileStream.Create(ImageName,fmOpenRead);
  try
    SetLength(S,FS.Size);
    FS.Read(S[1],FS.Size);
    SR := Encode64(S);
    FR:=TFileStream.Create(TextName,fmCreate);
    try
      FR.Write(SR[1],Length(SR));
    finally
      FR.Free;
    end ;
  Finally
 
   FS.Free;
  End;
End;



Procedure Decode_Image(TextName,ImageName : String);
Var
  FS,FR : TFileStream;
  S, SR : string ;
Begin
  FS:=TFileStream.Create(TextName,fmOpenRead);
  try
    SetLength(S,FS.Size);
    FS.Read(S[1],FS.Size);
    SR := Decode64(S);
    FR:=TFileStream.Create(ImageName,fmCreate);
    try
      FR.Write(SR[1],Length(SR));
    finally
      FR.Free;
    end;
  Finally

    FS.Free;
  End;
End;

// Exemple d'utilisation



procedure TForm1.Button1Click(Sender: TObject);
begin
  Encode_Image( 'C:\Temp\Dscf4671.jpg', 'C:\Temp\Dscf4671.txt' ) ;
end;



procedure TForm1.Button2Click(Sender: TObject);
begin
  Decode_Image( 'C:\Temp\Dscf4671.txt' , 'C:\Temp\Dscf4671_2.jpg' ) ;
end;


Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
Messages postés
1719
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
6 août 2020
3
orelien, s'il te plait...

Clique sur réponse acceptée en face des réponses qui te conviennent :
1 -  ça fera plaisir à ceux (nombreux) qui se sont investis dans la recherche d'une solution à ton problème,
2 - ça montre que le sujet est résolu.

Merci.
Messages postés
17
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
22 janvier 2008

slt , j bien lu ton message , je c pas , j essayé d'appliquer les procedures et les fonctions , que tu viens de les noter sur le forum , mais ça marche pas tjrs sous delphi5 , si tu as une idée comment faire , stp , repond moi , car j besoin de ces procedures , et pas sous delphi7 , car j que le 5 ........merçi !
Messages postés
3
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
21 février 2008

Bonjour,

J'ai la problématique présentée ci-dessus mais en VB Access.

En entrée le nom d'un fichier avec son chemin et d'avoir en sortie le fichier image en Base64

Merci de votre aide