Salvado Jpeg em um TMemoryStream
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.
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.
Dudasm
Curtidas 0
Respostas
Glecio
01/02/2006
Caro amigo, tenho essa rotina em um velho sistema rodando com IB 6.0.
Tenta assim:
Qualquer dúvida, estou a disposição . . .
Tenta assim:
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 . . .
GOSTEI 0
Dudasm
01/02/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.
Caro amigo, tenho essa rotina em um velho sistema rodando com IB 6.0.
Tenta assim:
Qualquer dúvida, estou a disposição . . .
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;
GOSTEI 0