Coder une image dans un fichier texte

Résolu
cs_orelien Messages postés 137 Date d'inscription dimanche 7 juillet 2002 Statut Membre Dernière intervention 11 janvier 2009 - 27 nov. 2007 à 21:03
pepere28 Messages postés 3 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 21 février 2008 - 20 févr. 2008 à 07:57
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

cs_orelien Messages postés 137 Date d'inscription dimanche 7 juillet 2002 Statut Membre Dernière intervention 11 janvier 2009
2 déc. 2007 à 13:10
Merci beaucoup, ça fonctionne très bien chez moi .
Les temps de conversions semble rapide.

Merci

Orélien.
3
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
27 nov. 2007 à 22:39
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
0
Utilisateur anonyme
28 nov. 2007 à 09:55
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;
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
28 nov. 2007 à 10:38
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;

 
 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
28 nov. 2007 à 11:46
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
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
28 nov. 2007 à 12:30
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="" />
0
Utilisateur anonyme
28 nov. 2007 à 12:56
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é
0
Utilisateur anonyme
28 nov. 2007 à 13:06
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.
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
28 nov. 2007 à 15:04
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.
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
28 nov. 2007 à 16:46
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;
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
28 nov. 2007 à 17:44
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
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
28 nov. 2007 à 18:10
Sa question date d'hier 21h, faudrait pt'etre lui laisser le temps de rentrer chez lui quand meme ;)
0
cs_orelien Messages postés 137 Date d'inscription dimanche 7 juillet 2002 Statut Membre Dernière intervention 11 janvier 2009
30 nov. 2007 à 02:44
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.
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
30 nov. 2007 à 09:08
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.
0
cs_orelien Messages postés 137 Date d'inscription dimanche 7 juillet 2002 Statut Membre Dernière intervention 11 janvier 2009
1 déc. 2007 à 19:41
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.
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
2 déc. 2007 à 00:16
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
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
2 déc. 2007 à 13:36
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.
0
salim07360 Messages postés 17 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 22 janvier 2008
13 janv. 2008 à 12:49
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 !
0
pepere28 Messages postés 3 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 21 février 2008
20 févr. 2008 à 07:57
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
0
Rejoignez-nous