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

cs_orelien 137 Messages postés dimanche 7 juillet 2002Date d'inscription 11 janvier 2009 Dernière intervention - 27 nov. 2007 à 21:03 - Dernière réponse : pepere28 3 Messages postés lundi 22 octobre 2007Date d'inscription 21 février 2008 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

20 réponses

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

Merci

Orélien.

Merci cs_orelien 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de cs_orelien
WhiteHippo 1270 Messages postés samedi 14 août 2004Date d'inscription 5 avril 2012 Dernière intervention - 27 nov. 2007 à 22:39
0
Merci
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
Commenter la réponse de WhiteHippo
Utilisateur anonyme - 28 nov. 2007 à 09:55
0
Merci
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;
Commenter la réponse de Utilisateur anonyme
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 28 nov. 2007 à 10:38
0
Merci
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;

 
 
Commenter la réponse de Guillemouze
Utilisateur anonyme - 28 nov. 2007 à 11:46
0
Merci
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
Commenter la réponse de Utilisateur anonyme
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 28 nov. 2007 à 12:30
0
Merci
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="" />
Commenter la réponse de Cirec
Utilisateur anonyme - 28 nov. 2007 à 12:56
0
Merci
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é
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 28 nov. 2007 à 13:06
0
Merci
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.
Commenter la réponse de Utilisateur anonyme
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 28 nov. 2007 à 13:30
0
Merci
Salut,

@Francky:
Dans le bloc note oui ... et c'est normale

Moi je parlais uniquement pour "Bitmap.SaveToFile"

Et non je ne vois pas l'intérêt et je rejoins Guillemouze sur ce point :
une sauvegarde normale devrait suffire

@Orélien
Pour avoir une idée sur la structure d'un fichier Bitmap je te conseil d'aller voir sur WotSit.Org

Et pour avoir un petit exemple d'écriture (création) d'un fichier Bitmap (24 / 32 bits) Regarde ce Thread

 
@+
Cirec

<hr siz="" />
Commenter la réponse de Cirec
cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention - 28 nov. 2007 à 15:04
0
Merci
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.
Commenter la réponse de cs_Loda
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 28 nov. 2007 à 16:46
0
Merci
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;
Commenter la réponse de Guillemouze
WhiteHippo 1270 Messages postés samedi 14 août 2004Date d'inscription 5 avril 2012 Dernière intervention - 28 nov. 2007 à 17:44
0
Merci
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
Commenter la réponse de WhiteHippo
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 28 nov. 2007 à 18:10
0
Merci
Sa question date d'hier 21h, faudrait pt'etre lui laisser le temps de rentrer chez lui quand meme ;)
Commenter la réponse de Guillemouze
cs_orelien 137 Messages postés dimanche 7 juillet 2002Date d'inscription 11 janvier 2009 Dernière intervention - 30 nov. 2007 à 02:44
0
Merci
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.
Commenter la réponse de cs_orelien
cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention - 30 nov. 2007 à 09:08
0
Merci
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.
Commenter la réponse de cs_Loda
cs_orelien 137 Messages postés dimanche 7 juillet 2002Date d'inscription 11 janvier 2009 Dernière intervention - 1 déc. 2007 à 19:41
0
Merci
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.
Commenter la réponse de cs_orelien
WhiteHippo 1270 Messages postés samedi 14 août 2004Date d'inscription 5 avril 2012 Dernière intervention - 2 déc. 2007 à 00:16
0
Merci
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
Commenter la réponse de WhiteHippo
japee 1799 Messages postés vendredi 27 décembre 2002Date d'inscription 19 juillet 2018 Dernière intervention - 2 déc. 2007 à 13:36
0
Merci
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.
Commenter la réponse de japee
salim07360 17 Messages postés mardi 6 décembre 2005Date d'inscription 22 janvier 2008 Dernière intervention - 13 janv. 2008 à 12:49
0
Merci
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 !
Commenter la réponse de salim07360
pepere28 3 Messages postés lundi 22 octobre 2007Date d'inscription 21 février 2008 Dernière intervention - 20 févr. 2008 à 07:57
0
Merci
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
Commenter la réponse de pepere28

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.