TmemoryStream + TImage ... ?

TmemoryStream + TImage ... ? - Delphi/Pascal - Programmation

Marsh Posté le 04-06-2005 à 11:49:20    

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.

Reply

Marsh Posté le 04-06-2005 à 11:49:20   

Reply

Marsh Posté le 04-06-2005 à 12:30:17    

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
Reply

Marsh Posté le 04-06-2005 à 13:08:41    

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 ?

Reply

Marsh Posté le 04-06-2005 à 13:41:59    

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
Reply

Marsh Posté le 04-06-2005 à 14:19:31    

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
Reply

Marsh Posté le 04-06-2005 à 14:31:08    

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
Reply

Marsh Posté le 04-06-2005 à 15:51:43    

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+

Reply

Marsh Posté le 18-02-2008 à 13:51:22    

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]
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed