JPG em Interbase...

Delphi

04/07/2005

esta função funciona muito bem em uma tabela paradox como estou mudando meu banco de dados para interbase num faço nem idéia de como proceder nesta questão...era feito assim...

No SpeedButton tinha esta função:


procedure T_FormCliente.SpeedButton11Click(Sender: TObject);
var
  FileStream : TFileStream;
  BlobStream : TBlobStream;
begin
Table1.edit;
  if Opendialog1.Execute then
     begin
     FileStream := TFileStream.Create(OpenDialog1.FileName,
     fmOpenRead or fmShareDenyWrite);
     BlobStream := TBlobStream.Create(Table1Fig1, bmWrite);
     try
     BlobStream.CopyFrom(FileStream, FileStream.Size );
     finally
     FileStream.Free;
     BlobStream.Free;
  end;
  end
     else
    Abort;



no evento onchange do Datasource( isto para visualizar );


procedure T_FormCliente.DataSource1DataChange(Sender: TObject;
  Field: TField);
var
   BlobStream : TBlobStream;
   JpegImage : TJPEGImage;
begin
BlobStream := TBlobStream.Create(Table1Fig1, bmRead);
   if BlobStream.Size <> 0 then
   Begin
      Image3.Visible := true;
      JpegImage  := TJPEGImage.Create;
   Try
      JpegImage.LoadFromStream(BlobStream);
      Image3.Picture.Assign(JpegImage);
   Finally
      BlobStream.Free;
      JpegImage.Free;
   End;
   End
   Else
   Image3.Visible := false;



Será que tem algo similar á isto ?

Outra coisa na tabela em paradox o campo era Binary, e como ficaria isto no IB...

Valeu espero que possam me ajudar, este banco de dados é bém complicado para mexer...tá doido ....t+


Gigatel

Gigatel

Curtidas 0

Respostas

Sandra

Sandra

04/07/2005

Colega,

Encontrei estes tópicos e espero que ajude a buscar o que está procurando:
- [url=http://forum.clubedelphi.net/viewtopic.php?t=64501&highlight=blob+subtype]Salvar arquivo em campo BLOB[/url]
- [url=http://forum.clubedelphi.net/viewtopic.php?t=63431&highlight=blob+subtype]Delphi 7 - Firebird 1.5 - Gravar Foto[/url]
- [url=http://forum.clubedelphi.net/viewtopic.php?t=63354&highlight=blob+subtype]Sobre Gravar Imagem no BD e Tb Usar Códigos[/url]
- [url=http://forum.clubedelphi.net/viewtopic.php?t=61113&highlight=blob+subtype]Gravar imagem no Interbase[/url]

Sobre o campo Blob:
- [url=http://forum.clubedelphi.net/viewtopic.php?t=62452&highlight=blob+subtype]Campo Blob´s qdo usar ...[/url]
- [url=http://forum.clubedelphi.net/viewtopic.php?t=62122&highlight=blob+subtype]Tipo Blob - Qual Sub Type[/url]

Espero que ajude!


GOSTEI 0
Gigatel

Gigatel

04/07/2005

Sandra ajudou muito os links q vc postou...más sintetizei ao máximo os tópicos e conseguí fazer com que o banco de dados aceitasse as fotos, mas não consigo visualiza-las...o código para inserir as fotos em JPG no vanco de dados foi:


procedure T_FormCliente.SpeedButton11Click(Sender: TObject);
begin
if Opendialog1.Execute then
  begin
    DM1.BD_Clientes.edit;
    Image3.Picture.LoadFromFile(Opendialog1.FileName);
    DM1.BD_ClientesGS_CLI_FIGURA.LoadFromFile(Opendialog1.FileName);
  end;



Tentei este que estava no mesmo tópico para visualizar:


var
BS:TStream; MinhaImagem:TJPEGImage;
Campo:tblobfield;Foto:timage;
begin
if Campo.AsString <> ´´ Then
begin
BS := TStream.Create;
BS := Campo.DataSet.CreateBlobStream((Campo as Tblobfield),bmread);
MinhaImagem := TJPEGImage.Create;
MinhaImagem.LoadFromStream(BS);
Image3.Picture.Assign(MinhaImagem);
BS.Free;
MinhaImagem.Free;
end
else
Image3.Picture.Assign(nil);
end;


sem sucesso...

este é o que eu uso em Paradox num teria um jeito de reformular para funcionar no IB ?



procedure T_FormCliente.DataSource1DataChange(Sender: TObject;
  Field: TField);
var
   BlobStream : TBlobStream;
   JpegImage : TJPEGImage;
begin
   BlobStream := TBlobStream.Create(DM1.BD_ClientesGS_CLI_FIGURA, bmRead);
   if BlobStream.Size <> 0 then
     Begin
     Image3.Visible := true;
      JpegImage  := TJPEGImage.Create;
    Try
      JpegImage.LoadFromStream(BlobStream);
      Image3.Picture.Assign(JpegImage);
     Finally
      BlobStream.Free;
     JpegImage.Free;
    end;
   end
  else
   Image3.Visible := false;


o código acima dá um pau danado...


Valeu....


GOSTEI 0
Cabelo

Cabelo

04/07/2005

Tente assim :

procedure T_FormCliente.DataSource1DataChange(Sender: TObject;
Field: TField);
var
BlobStream : TBlobStream;
JpegImage : TJPEGImage;
begin
BlobStream := TBlobStream.Create(DM1.BD_ClientesGS_CLI_FIGURA, bmRead);
if BlobStream.Size <> 0 then
Begin
Image3.Visible := true;
JpegImage := TJPEGImage.Create;
Try
JpegImage.LoadFromStream(BlobStream);
Image3.Picture.Graphic.Assign(JpegImage);
Finally
BlobStream.Free;
JpegImage.Free;
end;
end
else
Image3.Visible := false;


GOSTEI 0
Gigatel

Gigatel

04/07/2005

Tente assim : procedure T_FormCliente.DataSource1DataChange(Sender: TObject; Field: TField); var BlobStream : TBlobStream; JpegImage : TJPEGImage; begin BlobStream := TBlobStream.Create(DM1.BD_ClientesGS_CLI_FIGURA, bmRead); if BlobStream.Size <> 0 then Begin Image3.Visible := true; JpegImage := TJPEGImage.Create; Try JpegImage.LoadFromStream(BlobStream); Image3.Picture.Graphic.Assign(JpegImage); Finally BlobStream.Free; JpegImage.Free; end; end else Image3.Visible := false;



deu uma mesagem de erro

typecaste de classe inválido.


GOSTEI 0
Sremulador

Sremulador

04/07/2005

declare a unit db


GOSTEI 0
Gigatel

Gigatel

04/07/2005

declare a unit db


pra que ? declarar esta unit ?


GOSTEI 0
Cabelo

Cabelo

04/07/2005

Qual o tipo de campo que você usa no interbase?


GOSTEI 0
Gigatel

Gigatel

04/07/2005

Qual o tipo de campo que você usa no interbase?


Blob..ele está gravando na IB ´so num tô conseguindo visualizar.


GOSTEI 0
Cabelo

Cabelo

04/07/2005

Cara eu fiz uma gambiarra, para resolver este problema enquanto não tenho a solução dfinitiva..


Faço uma cópia do blob no HD, om um nome qualquer.. depois dou um loadfromfile deste arquivo no componente TImage

funciona legal..

só não esqueça de deletar o arquivo depois da visualização..


GOSTEI 0
Gigatel

Gigatel

04/07/2005

Cara eu fiz uma gambiarra, para resolver este problema enquanto não tenho a solução dfinitiva.. Faço uma cópia do blob no HD, om um nome qualquer.. depois dou um loadfromfile deste arquivo no componente TImage funciona legal.. só não esqueça de deletar o arquivo depois da visualização..


interessante...vou ver isso...


GOSTEI 0
Gigatel

Gigatel

04/07/2005

O erro é gerado nesta linha


var
  FileStream : TFileStream;
  BlobStream : TBlobStream;
begin 
BD_Clientes.edit;
  if Opendialog1.Execute then 
     begin 
     FileStream := TFileStream.Create(OpenDialog1.FileName, 
     fmOpenRead or fmShareDenyWrite); 
     BlobStream := TBlobStream.Create(BD_ClientesGS_CLI_FIGURA, bmWrite);
     try
     BlobStream.CopyFrom(FileStream, FileStream.Size ); 
     finally 
     FileStream.Free; 
     BlobStream.Free; 
  end; 
  end 
     else 
    Abort; 


Nesta linha



[/code]
BlobStream := TBlobStream.Create(BD_ClientesGS_CLI_FIGURA, bmWrite);


tanto para gravar como para visualizar///



GOSTEI 0
Gigatel

Gigatel

04/07/2005

SOLUÇÃO ENCONTRADA....

Para inserir a imagem.

Lista:
OpenPictureDialog.
Speed Butoon
Image
No lugar onde está escrito ´ ´GS_CLI_FIGURA´ é o campo da tabela onde vai armazenar a foto.

em um speed butoon.

   If Not OpenPictureDialog1.Execute Then
   Exit;
   Image3.Picture.LoadFromFile( OpenPictureDialog1.FileName );
     If DataSource1.DataSet.State = dsBrowse Then
     DataSource1.DataSet.Edit;
     GravaFoto( ´GS_CLI_FIGURA´, OpenPictureDialog1.FileName );


criar duas funções ( para facilitar más coloque do jeito que achar melhor )

eu declarei aki...

 public
  Procedure GravaFoto( NomeCampo, FileName: String );
  Procedure ObtemFoto( NomeCampo: String; Var imgDestino: TImage );



AS funções

Procedure T_FormCliente.GravaFoto( NomeCampo, FileName: String );
Var
  stImagem: TFileStream;
Begin
  stImagem := TFileStream.Create( FileName, fmOpenRead Or fmShareDenyWrite );
  Try
    TBlobField( DataSource1.DataSet.FieldByName( NomeCampo ) ).LoadFromStream( stImagem );
  Finally
    stImagem.Free;
  End;
End;

Procedure T_FormCliente.ObtemFoto( NomeCampo: String; Var imgDestino: TImage );
Var
  jpgImg: TJPEGImage;
  stMem: TMemoryStream;
Begin
  If TBlobField( DataSource1.DataSet.FieldByName( NomeCampo ) ).IsNull Then
  Begin
    imgDestino.Picture := Nil;
    Exit;
  End;
  jpgImg := TJPEGImage.Create;
  stMem := TMemoryStream.Create;
  Try
    TBlobField( DataSource1.DataSet.FieldByName( NomeCampo ) ).SaveToStream( stMem );
    stMem.Position := 0;
    jpgImg.LoadFromStream( stMem );
    imgDestino.Picture.Assign( jpgImg );
  Finally
    stMem.Free;
    jpgImg.Free;
  End;
  end;



e para vizualizar eu não consegui colocar no evento DataChange do data source pois aí a foto apareceria automático, más dá pau a solução encontrada é colocar nos botões de avançar e voltar e no evento Onshow da tabela,

o código:

 _FormCliente.ObtemFoto( ´GS_CLI_FIGURA´,  _FormCliente.Image3 );



Valeu a todos que me ajudaram, más tem mais bombas por aí...está da figura foi apenas um aperitivo...e fica aí a função completa e sem gambiarras...valew..mesmo..


GOSTEI 0
Sremulador

Sremulador

04/07/2005

pode mandar...


GOSTEI 0
Gigatel

Gigatel

04/07/2005

Problemas e bug´s... Aconteceu uma coisa muito curiosa, no meu formulário existe um PAGECONTROL onde determino onde fica as formas do formulário, na primeira parte ( PAGE1 ) fica os ítens de cadastro,nome end. etc....na sengunda parte ( PAGE 2 ) fica onde insiro a foto, depois de tudo cadastrado onde fica o PAGE 1 posso navegar pelos registros sem problemas ( inclusive onde num tem foto cadastrada ), más se coloco o no PAGE 2 ele dá um erro ( JPG erro #42 ) más somente neste ponto ( PAGE 2)...será que tem alguma coisa a ver com o IMAGE1 estar sempre visivél ?
veja...o código.


Procedure T_FormCliente.GravaFoto( NomeCampo, FileName: String ); 
Var 
  stImagem: TFileStream; 
Begin 
  stImagem := TFileStream.Create( FileName, fmOpenRead Or fmShareDenyWrite ); 
  Try 
    TBlobField( DataSource1.DataSet.FieldByName( NomeCampo ) ).LoadFromStream( stImagem ); 
  Finally 
    stImagem.Free; 
  End; 
End; 

Procedure T_FormCliente.ObtemFoto( NomeCampo: String; Var imgDestino: TImage ); 
Var 
  jpgImg: TJPEGImage; 
  stMem: TMemoryStream; 
Begin 
  If TBlobField( DataSource1.DataSet.FieldByName( NomeCampo ) ).IsNull Then 
  Begin 
    imgDestino.Picture := Nil; 
    Exit; 
  End; 
  jpgImg := TJPEGImage.Create; 
  stMem := TMemoryStream.Create; 
  Try 
    TBlobField( DataSource1.DataSet.FieldByName( NomeCampo ) ).SaveToStream( stMem ); 
    stMem.Position := 0; 
    jpgImg.LoadFromStream( stMem ); 
    imgDestino.Picture.Assign( jpgImg ); 
  Finally 
    stMem.Free; 
    jpgImg.Free; 
  End; 
  end; 



estranho...muito estranho...

para visualizar uso este código

_FormCliente.ObtemFoto( ´GS_CLI_FIGURA´, _FormCliente.Image1 );

valeu...


GOSTEI 0
Kapak

Kapak

04/07/2005

O problema pode estar na imagem do banco de dados; pode não ser um jpg ou outra coisa. Veja a definição do erro em:
http://homepages.borland.com/efg2lab/Library/Delphi/Graphics/JpegErrors.txt


GOSTEI 0
Gigatel

Gigatel

04/07/2005

se eu desabilitar o image num dá o pau tem como colocar na fução quando naum houver figura o image ficar em FALSE ?


GOSTEI 0
Kapak

Kapak

04/07/2005

Vc pode testar TBlobField.BlobSize > 0 antes de carregar a imagem.


GOSTEI 0
Gigatel

Gigatel

04/07/2005

Vc pode testar TBlobField.BlobSize > 0 antes de carregar a imagem.


Valeu más num é para esta função e sim para esta...

Procedure T_FormCliente.GravaFoto( NomeCampo, FileName: String ); 
Var 
  stImagem: TFileStream; 
Begin 
  stImagem := TFileStream.Create( FileName, fmOpenRead Or fmShareDenyWrite ); 
  Try 
    TBlobField( DataSource1.DataSet.FieldByName( NomeCampo ) ).LoadFromStream( stImagem ); 
  Finally 
    stImagem.Free; 
  End; 
End; 

Procedure T_FormCliente.ObtemFoto( NomeCampo: String; Var imgDestino: TImage ); 
Var 
  jpgImg: TJPEGImage; 
  stMem: TMemoryStream; 
Begin 
  If TBlobField( DataSource1.DataSet.FieldByName( NomeCampo ) ).IsNull Then 
  Begin 
    imgDestino.Picture := Nil; 
    Exit; 
  End; 
  jpgImg := TJPEGImage.Create; 
  stMem := TMemoryStream.Create; 
  Try 
    TBlobField( DataSource1.DataSet.FieldByName( NomeCampo ) ).SaveToStream( stMem ); 
    stMem.Position := 0; 
    jpgImg.LoadFromStream( stMem ); 
    imgDestino.Picture.Assign( jpgImg ); 
  Finally 
    stMem.Free; 
    jpgImg.Free; 
  End; 
  end; 



valew..


GOSTEI 0
Kapak

Kapak

04/07/2005

Qual delas ? tem duas. Se for a que obtém a foto, vc tem o TBlobField e pode testar a propriedade BlobSize. E nas duas vc Streams e pode testar
a propriedade Size.


GOSTEI 0
Gigatel

Gigatel

04/07/2005

Qual delas ? tem duas. Se for a que obtém a foto, vc tem o TBlobField e pode testar a propriedade BlobSize. E nas duas vc Streams e pode testar a propriedade Size.


credo ne ví. que tinha duas funções...
é este..e como ficaria na função ?

Procedure T_FormCliente.ObtemFoto( NomeCampo: String; Var imgDestino: TImage ); 
Var 
  jpgImg: TJPEGImage; 
  stMem: TMemoryStream; 
Begin 
  If TBlobField( DataSource1.DataSet.FieldByName( NomeCampo ) ).IsNull Then 
  Begin 
    imgDestino.Picture := Nil; 
    Exit; 
  End; 
  jpgImg := TJPEGImage.Create; 
  stMem := TMemoryStream.Create; 
  Try 
    TBlobField( DataSource1.DataSet.FieldByName( NomeCampo ) ).SaveToStream( stMem ); 
    stMem.Position := 0; 
    jpgImg.LoadFromStream( stMem ); 
    imgDestino.Picture.Assign( jpgImg ); 
  Finally 
    stMem.Free; 
    jpgImg.Free; 
  End; 
  end; 



GOSTEI 0
Kapak

Kapak

04/07/2005

Tente implementar no primeiro [b:346c6b5e4a]if[/b:346c6b5e4a]:
 If TBlobField( DataSource1.DataSet.FieldByName( NomeCampo ) ).IsNull or (TBlobField(DataSource1.DataSet.FieldByName( NomeCampo)).BlobSize = 0) Then 
  Begin 
    imgDestino.Picture := Nil; 
    Exit; 
  End;



GOSTEI 0
Gigatel

Gigatel

04/07/2005

Tente implementar no primeiro [b:a1ccab7870]if[/b:a1ccab7870]:
 If TBlobField( DataSource1.DataSet.FieldByName( NomeCampo ) ).IsNull or (TBlobField(DataSource1.DataSet.FieldByName( NomeCampo)).BlobSize = 0) Then 
  Begin 
    imgDestino.Picture := Nil; 
    Exit; 
  End;



É isso aí............deu certinho...muito obrigado...


GOSTEI 0
Gigatel

Gigatel

04/07/2005

Aki está a função completa...


Procedure T_FormCliente.ObtemFoto( NomeCampo: String; Var imgDestino: TImage );
Var
  jpgImg: TJPEGImage;
  stMem: TMemoryStream;
begin
  If TBlobField( DataSource1.DataSet.FieldByName( NomeCampo ) ).IsNull or (TBlobField(DataSource1.DataSet.FieldByName( NomeCampo)).BlobSize = 0) Then
  Begin
    imgDestino.Picture := Nil;
    Exit;
  End;
  jpgImg := TJPEGImage.Create;
  stMem := TMemoryStream.Create;
  try
    TBlobField( DataSource1.DataSet.FieldByName( NomeCampo ) ).SaveToStream( stMem );
    stMem.Position := 0;
    jpgImg.LoadFromStream( stMem );
    imgDestino.Picture.Assign( jpgImg );
  finally
    stMem.Free;
    jpgImg.Free;
  end;




Agradecimentos para todos más em epecial a pessoal que ajudou a resolver este problema: kapak, sremulador, Cabelo.

T+ galera ( ou até daki a pouco até agarrar em outra função )..


GOSTEI 0
POSTAR