Salvado Jpeg em um TMemoryStream

01/02/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.


Dudasm

Respostas

01/02/2006

Glecio

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

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 Citar

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:

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 Citar