Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1897 connectés 

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  TmemoryStream + TImage ... ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

TmemoryStream + TImage ... ?

n°1107974
locas
Posté le 04-06-2005 à 11:49:20  profilanswer
 

Bonjour,
 
J'ai un petit probleme pour afficher un TmemoryStream dans un Timage. L'image provient d'un fichier XML encodé en MIME avec TIdEncoderMIME. Si j'utilise un TFileStream, ca marche très bien mais je n'arrive pas avec un TmemoryStream.
 
Voici les fonctions que j'ai créées :
 
POUR L'ENCODAGE :
 
var fs: TFileStream;
begin
  fs:= TFileStream.Create(Filename, fmOpenRead or fmShareDenyWrite);
 
  try
    with TIdEncoderMIME.Create(nil) do
      result := Encode(fs);
  finally
    fs.Free;
  end;
end;
 
 
 
POUR LE DECODAGE EN FILESTREAM :
 
var fs: TFileStream;
begin
  With Fenetre_principale.XML_Language.ChildNodes.Nodes['language'].ChildNodes.Nodes['informations'].ChildNodes do
  begin
    try
      fs := TFileStream.Create(Filename, fmCreate);
 
      with TIdDecoderMIME.Create(nil) do
        DecodeToStream(Nodes['flag'].Text;, fs);
    finally
      fs.Free;
    end;
  end;
end;
 
 
 
POUR LE DECODAGE EN MEMORYSTREAM :
 
var fs: TMemoryStream;
begin
  try
    fs := TMemoryStream.Create;
 
    With fenetre_principale.XML_Language.ChildNodes.Nodes['language'].ChildNodes.Nodes['informations'].ChildNodes do
    begin
 
      try
        fs := TMemoryStream.Create;
 
        with TIdDecoderMIME.Create(nil) do
          DecodeToStream(Nodes['flag'].Text, fs);
      finally
        Image14.Picture.Bitmap.LoadFromStream(fs);
        Image14.Stretch := True;
        fs.Free;
      end;
    end;
  except
 
  end;
 
 
 
Voilà, est-ce que quelqu'un comprends pourquoi ca marche pas la solution des MEMORYSTREAM parce que toutes les autres fonctionnent ... ?
 
Je vous remercie par avance de vos réponses.

mood
Publicité
Posté le 04-06-2005 à 11:49:20  profilanswer
 

n°1108002
antp
Super Administrateur
Champion des excuses bidons
Posté le 04-06-2005 à 12:30:17  profilanswer
 

Dis t'as mal recopié le code que je t'avais donné, t'oublies de libérer le TIdDecoderMime :o
 
Et mettre le LoadFromStream dans le finally c'est un peu dangereux... c'est pas sa place. Il devrait être avant le finally.
 
Sinon pour ton problème essaie de faire un fs.Seek(0, soFromBeginning) avant le LoadFromStream pour être sûr qu'il revienne bien au début (peut-être qu'il tente de charger les données à partir de la position actuelle)


Message édité par antp le 04-06-2005 à 12:30:35

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1108017
locas
Posté le 04-06-2005 à 13:08:41  profilanswer
 

merci, j'ai fait les modifications mais maintenant, il me sort  au "LoadFromStream" ce message : Bitmap image is not valide.
 
Donc, apparemment, le format de l'image dans le stream n'est pas correcte ... bizarre. et sans le fs.Seek(0, soFromBeginning), ca plante pas mais je vois le Timage se raffraichir ... une idée ?

n°1108024
antp
Super Administrateur
Champion des excuses bidons
Posté le 04-06-2005 à 13:41:59  profilanswer
 

Sans le Seek il voit qu'il n'y a rien à charger (EOF) et donc il charge rien [:spamafote]
Si il dit que l'image est pas valide c'est qu'elle est pas valide :D Tu stockes l'image encodée comment ? Dans un CDATA ou directement dans un nœud XML ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1108043
locas
Posté le 04-06-2005 à 14:19:31  profilanswer
 

directement dans un noeud xml mais pourtant, mon code marche parfaitement avec un FILESTREAM ...


Message édité par locas le 04-06-2005 à 14:39:24
n°1108054
locas
Posté le 04-06-2005 à 14:31:08  profilanswer
 

Apparemment, "DecodeToStream" ne renvoi rien !!! Voici mon unité ( que j'ai reprise ) :
 
--------------------------------------------------------------
 
unit UseFull;
 
interface
 
Uses SysUtils, Classes, IdCoderMIME;
 
function FileToMime(FileName: String): String;
procedure MimeToFile(MimeString: String; FileName: String);
Function MimeToMemoryStream(MimeSring: String): TMemoryStream;
 
implementation
 
 
 
 
function FileToMime(FileName: String): String;
var fs: TFileStream;
begin
  fs:= TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
 
  try
    with TIdEncoderMIME.Create(nil) do
    begin
      try
        result := Encode(fs);
      finally
        Free;
      end;
    end;
  finally
    fs.Free;
  end;
end;
 
 
 
procedure MimeToFile(MimeString: String; FileName: String);
var fs: TFileStream;
begin
  try
    fs := TFileStream.Create(FileName, fmCreate);
 
    with TIdDecoderMIME.Create(nil) do
    begin
      try
        DecodeToStream(MimeString, fs);
      finally
        Free;
      end;
    end;
  finally
    fs.Free;
  end;
end;
 
 
 
Function MimeToMemoryStream(MimeSring: String; var ms: TMemoryStream): TMemoryStream;
begin
  try
    ms.Seek(0, soFromBeginning);
 
    with TIdDecoderMIME.Create(nil) do
    begin
      try
        DecodeToStream(MimeSring, ms);
        result := ms;
      finally
        Free;
      end;
    end;
  except
  end;
end;
 
 
 
------------------------------------------------------------
 
Voici maintenant mes appels aux fonctions :
 
 
-> D'un fichier au MIME ( marche bien !!! ):
 
  FlatEdit11.Text := FileToMime('C:\FR.bmp');
 
 
-------------------------------------------------------------
 
-> D'un MIME à un fichier ( marche bien !!! ):
 
  With fenetre_principale.XML_Language.ChildNodes.Nodes['language'].ChildNodes.Nodes['informations'].ChildNodes do
  begin
    MimeToFile(Nodes['flag'].Text, 'C:\Test__2.bmp');
  end;
 
 
-------------------------------------------------------------
 
-> D'un MIME à un TMemoryStream ( ERREUR - Marche pas !!! ):
 
var ms: TMemoryStream;
begin
  try
    ms := TMemoryStream.Create;
 
    With fenetre_principale.XML_Language.ChildNodes.Nodes['language'].ChildNodes.Nodes['informations'].ChildNodes do
    begin
      ms := MimeToMemoryStream(Nodes['flag'].text, ms);
 
      Image14.Picture.Bitmap.LoadFromStream(ms);
      Image14.Stretch := True;
    end;
  finally
    ms.Free;
  end;


Message édité par locas le 04-06-2005 à 15:30:42
n°1108093
locas
Posté le 04-06-2005 à 15:51:43  profilanswer
 

Ca y est, ca marche ... en fait, il faut mettre un seek avant et après le "DecodeToStream".
 
Donc, pour ceux que ca intéresse, voici mon unité :
 
--------------------------------------------------------------
 
unit UseFull;
 
interface
 
Uses SysUtils, Classes, Graphics, Dialogs, IdCoderMIME;
 
function FileToMime(FileName: String): String;
procedure MimeToFile(MimeString: String; FileName: String);
procedure MimeToMemoryStream(Const MimeSring: String; var ms: TMemoryStream);
 
implementation
 
 
 
 
function FileToMime(FileName: String): String;
var fs: TFileStream;
begin
  fs:= TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
 
  try
    with TIdEncoderMIME.Create(nil) do
    begin
      try
        result := Encode(fs);
      finally
        Free;
      end;
    end;
  finally
    fs.Free;
  end;
end;
 
 
 
procedure MimeToFile(MimeString: String; FileName: String);
var fs: TFileStream;
begin
  try
    fs := TFileStream.Create(FileName, fmCreate);
 
    with TIdDecoderMIME.Create(nil) do
    begin
      try
        DecodeToStream(MimeString, fs);
      finally
        Free;
      end;
    end;
  finally
    fs.Free;
  end;
end;
 
 
 
procedure MimeToMemoryStream(Const MimeSring: String; var ms: TMemoryStream);
begin
  try
    ms.Seek(0, soFromBeginning);
 
    with TIdDecoderMIME.Create(nil) do
    begin
      try
        DecodeToStream(MimeSring, ms);
        ms.Seek(0, soFromBeginning);
      finally
        Free;
      end;
    end;
  except
  end;
end;
 
 
end.
 
 
------------------------------------------------------------
 
 
------------------------------------------------------------
 
Voici maintenant mes appels aux fonctions :
 
 
-> D'un fichier au MIME ( marche bien !!! ):
 
  FlatEdit11.Text := FileToMime('C:\FR.bmp');
 
 
-------------------------------------------------------------
 
-> D'un MIME à un fichier ( marche bien !!! ):
 
  With fenetre_principale.XML_Language.ChildNodes.Nodes['language'].ChildNodes.Nodes['informations'].ChildNodes do
  begin
    MimeToFile(Nodes['flag'].Text, 'C:\Test__2.bmp');
  end;
 
 
-------------------------------------------------------------
 
-> D'un MIME à un TMemoryStream ( Marche bien également !!! ):  
 
 
var ms: TMemoryStream;
begin
  try
    ms := TMemoryStream.Create;
 
    With fenetre_principale.XML_Language.ChildNodes.Nodes['language'].ChildNodes.Nodes['informations'].ChildNodes do
    begin
      MimeToMemoryStream(Nodes['flag'].text, ms);
 
      Image14.Picture.Bitmap.LoadFromStream(ms);
      Image14.Stretch := True;
    end;
  finally
    ms.Free;
  end;
 
 
------------------------------------------------------------
 
Voilà, en éspérant que ca pourra aider des personnes et merci à tous ( particulièrement à antp pour ses réponses )  
 
a+

n°1687798
mkracing66
Posté le 18-02-2008 à 13:51:22  profilanswer
 

Bonjour,
 
qqun connait l equivalent de DecodeToStream   (TIdDecoderMIME) sous Delphi 2007 (Indy 10.1.1) ?
 
Merci


---------------
L'ennemi est bête : il croit que c'est nous l'ennemi alors que c'est lui ! [Pierre Desproges]

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  TmemoryStream + TImage ... ?

 

Sujets relatifs
afficher dynamiquement dans un Timage des gifs(voir 5em posts)Timage utilisé en tant que lien vers un Twebrowser
RAZ d'un TImage ?[Astuce delphi] Timage qui "clignote" quand on change l'image...
[C++ BUILDER]Utilisation de TImage [RESOLU][Delphi] Charger un TImage à partir d'une image d'un TimageList
[Delphi] Scintillement lors du mouvement de composants Timage[Delphi] MDIForm et TIMage
[Delphi 5] A propos du composant TImage ... 
Plus de sujets relatifs à : TmemoryStream + TImage ... ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR