TmemoryStream + TImage ... ? - Delphi/Pascal - Programmation
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
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)
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 ?
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
Si il dit que l'image est pas valide c'est qu'elle est pas valide Tu stockes l'image encodée comment ? Dans un CDATA ou directement dans un nud XML ?
Marsh Posté le 04-06-2005 à 14:19:31
directement dans un noeud xml mais pourtant, mon code marche parfaitement avec un FILESTREAM ...
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;
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+
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
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.