Array
(
)

Salvado Jpeg em um TMemoryStream

Dudasm
   - 01 fev 2006

Estou tentando salvar uma imagem Jpeg em um TMemoryStream para salvar em um campo Image do SQL Server, porem estou com problemas, acho que quando salvo a imagem do TImage para o TMemoryStream ela não vai e assim quando tento ler dar erro.
Fiz um teste simples que deveria funcionar mais não esta funcionando, segue abaixo o código.
Criei um form com 2 TImage e com 2 Botões, no 1º TImage eu adicionei uma imagem Jpeg qualquer e quando clico no botão 1 ele pega o conteudo do TImage1 e coloca em um TMemoryStream, depois quando eu clico no Botão 2 ele pega o conteúdo do TMemoryStream e coloca no TImage2, porem não funciona, o que estaria errado??

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Jpeg, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
Image2: TImage;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
b:TMemoryStream;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Picture.Graphic.SaveToStream(b);
ShowMessage(´Imagem transferida do Image1 para o Stream´);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Image2.Picture.Graphic.LoadFromStream(b);
ShowMessage(´Imagem transferida do Stream para o Image2´);
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
b:=TMemoryStream.Create;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
b.Destroy;
end;

end.


Glecio
   - 01 fev 2006

Caro amigo, tenho essa rotina em um velho sistema rodando com IB 6.0.

Tenta assim:


#Código



Procedure GravandoNoBD;
Var
FleStm: TFileStream;
Begin
If EscolheuImagem Then Begin
{Grava a Imagem no BD}
FleStm := TFileStream.Create(NomedoArquivo, fmOpenRead or fmShareDenyWrite);
DataModule.Query.Sql.Add(´UpDate Tabela Set FieldImage = :FieldImage´);
DataModule.Query.ParamByName(´FieldImage´).LoadFromStream(FleStm, ftBlob);
FleStm.Free;
End Else Begin
{Apaga a Imagem no BD}
DataModule.Query.Sql.Add(´UpDate Tabela Set FieldImage = Null´);
End;
DataModule.Query.ExecSql;
DataModule.Query.CommitRetaining;
End;

Procedure PegandoImagemNoBD;
Var
MemStm: TMemoryStream;
Begin
If Not DataModule.Query.FieldByName(´FieldImage´).IsNull Then Begin
MemStm := TMemoryStream.Create;
DataModule.Query.FieldByName(´FieldImage´).SaveToStream(MemStm);
Try
MemStm.Position := 0;
Image.Picture.Bitmap.LoadFromStream(MemStm);
Image.Repaint;
Finally
MemStm.Free;
End;
End;
End;



Qualquer dúvida, estou a disposição . . .


Dudasm
   - 02 fev 2006

Obrigado Glecio, mas desse jeito a imagem é salva em BMP e eu fiz uns testes e fica em média cada imagem com 230kb equanto a JPG fica com 4kb. Mesmo assim obrigado.




Citação:
Caro amigo, tenho essa rotina em um velho sistema rodando com IB 6.0.

Tenta assim:


#Código



Procedure GravandoNoBD;
Var
FleStm: TFileStream;
Begin
If EscolheuImagem Then Begin
{Grava a Imagem no BD}
FleStm := TFileStream.Create(NomedoArquivo, fmOpenRead or fmShareDenyWrite);
DataModule.Query.Sql.Add(´UpDate Tabela Set FieldImage = :FieldImage´);
DataModule.Query.ParamByName(´FieldImage´).LoadFromStream(FleStm, ftBlob);
FleStm.Free;
End Else Begin
{Apaga a Imagem no BD}
DataModule.Query.Sql.Add(´UpDate Tabela Set FieldImage = Null´);
End;
DataModule.Query.ExecSql;
DataModule.Query.CommitRetaining;
End;

Procedure PegandoImagemNoBD;
Var
MemStm: TMemoryStream;
Begin
If Not DataModule.Query.FieldByName(´FieldImage´).IsNull Then Begin
MemStm := TMemoryStream.Create;
DataModule.Query.FieldByName(´FieldImage´).SaveToStream(MemStm);
Try
MemStm.Position := 0;
Image.Picture.Bitmap.LoadFromStream(MemStm);
Image.Repaint;
Finally
MemStm.Free;
End;
End;
End;



Qualquer dúvida, estou a disposição . . .