Salvado Jpeg em um TMemoryStream
01/02/2006
0
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
Curtir tópico
+ 0
Responder
Posts
01/02/2006
Glecio
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 . . .
Responder
02/02/2006
Dudasm
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;
Responder
Clique aqui para fazer login e interagir na Comunidade :)