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

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

Votre réponse

20 réponses

Meilleure réponse
Messages postés
137
Date d'inscription
dimanche 7 juillet 2002
Dernière intervention
11 janvier 2009
- 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é 88 internautes ce mois-ci

Commenter la réponse de cs_orelien
Messages postés
1270
Date d'inscription
samedi 14 août 2004
Dernière intervention
5 avril 2012
- 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
- 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
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
- 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
- 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
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
- 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
- 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
- 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
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
- 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
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Dernière intervention
30 juillet 2009
- 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
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
- 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
Messages postés
1270
Date d'inscription
samedi 14 août 2004
Dernière intervention
5 avril 2012
- 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
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
- 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
Messages postés
137
Date d'inscription
dimanche 7 juillet 2002
Dernière intervention
11 janvier 2009
- 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
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Dernière intervention
30 juillet 2009
- 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
Messages postés
137
Date d'inscription
dimanche 7 juillet 2002
Dernière intervention
11 janvier 2009
- 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
Messages postés
1270
Date d'inscription
samedi 14 août 2004
Dernière intervention
5 avril 2012
- 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
Messages postés
1799
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
19 juillet 2018
- 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
Messages postés
17
Date d'inscription
mardi 6 décembre 2005
Dernière intervention
22 janvier 2008
- 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
Messages postés
3
Date d'inscription
lundi 22 octobre 2007
Dernière intervention
21 février 2008
- 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.