Pessoal, tenho essa unit que o nosso colega Enio Marconcini passou a um tempo atrás, que achei aqui na lista, que parece que deveria funcionar para salvar uma imagem jpg diretamente no banco de dados FB em um campo blob sub_type 0, só que não salva, dá msg de erro "bitmat image is not valid", gente segue abaixo a unit tal qual peguei aqui.Não sei o que pode estar havendo de errado. { Unit: U_BlobImageFB.pas Versão: 1.0 Autor: Enio Rodrigo Marconcini Email: [EMAIL PROTECTED] Msn: [EMAIL PROTECTED] GoogleTalk: [EMAIL PROTECTED] Skype: eniorm
DELFOS Desenvolvimento de Sistemas www.delfosdesenvolvimentos.com [EMAIL PROTECTED] ** DESCRICAO ** Unit específica para trabalhar com imagens em banco de dados Firebird/Interbase, utilizando campos BLOB. Funciona com os componentes de acesso IBX (palheta Interbase) e com o Mercury Data Objects (MDO). Não foi testado com outros componentes de acesso. Visa compatibilidade apenas com os citados acima. Suporta arquivos JPEG (*.jpg ou *.jpeg) ou Bitmaps (*.bmp). Imagens Bitmap, antes de serem gravadas no banco, são convertidas em Jpeg e comprensadas pelo procedimento Compress do TJpegImage. Um bitmap de 1.30 Mb fica reduzido a um jpg de cerca de 150 Kb. ** a taxa de compressão varia de acordo com a imagem ** Os códigos para gravar a imagem no campo blob foram copiados de tópicos dos foruns ClubeDelphi (www.clubedelphi.net) Após ter criado esses procedimentos numa unit U_CadastroClientes.pas resolvi criar uma unit somente para manipular imagens. ============================================================================== ** Modus Operandi ** PARA EXIBIR UM CAMPO BLOB COM IMAGEM NUM TImage procedure ExibeFoto(DataSet : TDataSet; BlobFieldName : String; ImageExibicao : TImage); ExibeFoto(qryCliente,'FOTO',Image1); qryCliente - é a query/dataset com os dados 'FOTO' - string com o nome do campo blob Image1 - componente TImage onde será exibido a foto ----- GRAVAR UMA IMAGEM NUM CAMPO BLOB (a query/dataset deve estar com State in [dsEdit,dsInsert] procedure GravaFoto(DataSet : TDataSet; BlobFieldName, FileName : String); GravaFoto(qryCliente,'FOTO','filename.jpg'); qryCliente - é a query/dataset com os dados 'FOTO' - string com o nome do campo blob 'filename' - string com o nome de arquivo jpg ou bmp ** você poderá substituir o 'filename' por: OpenPictureDialog1.FileName ----- EXCLUIR A FOTO DE UM CAMPO BLOB procedure ExcluiFoto(DataSet : TDataSet; BlobFieldName : String); ExcluiFoto(qryCliente,'FOTO'); qryCliente - é a query/dataset com os dados 'FOTO' - string com o nome do campo blob ** para limpar a imagem do TImage: TImage1.Picture := Nil ** ** não coloquei o codigo nessa unit, talvez você poderá não querer que a imagem ** seja limpada do TImage apos ter sido excluida do campo. ----- PARA EXPORTAR UMA IMAGEM DE UM CAMPO BLOB PARA UM ARQUIVO procedure ExportaFoto(DataSet : TDataSet; BlobFieldName, FileName : String; TipoImagem : TTipoImagem); ExportaFoto(qryCliente,'FOTO','filename.jpg',tiJpeg); qryCliente - é a query/dataset com os dados 'FOTO' - string com o nome do campo blob 'filename' - string com o nome de arquivo jpg ou bmp a ser exportado tiJpeg/tiBitmap - tipo do arquivo a ser exportado: Bitmap ou Jpeg ** você poderá substituir o 'filename' por: OpenPictureDialog1.FileName } unit U_BlobImageFB; interface uses Jpeg, Graphics, ExtDlgs, Classes, DB, SysUtils, ExtCtrls, Dialogs, Consts; const OffsetMemoryStream : Int64 = 0; type TTipoImagem = (tiBitmap, tiJpeg); procedure ExibeFoto(DataSet : TDataSet; BlobFieldName : String; ImageExibicao : TImage); procedure GravaFoto(DataSet : TDataSet; BlobFieldName, FileName : String); procedure ExcluiFoto(DataSet : TDataSet; BlobFieldName : String); procedure ExportaFoto(DataSet : TDataSet; BlobFieldName, FileName : String; TipoImagem : TTipoImagem); var MemoryStream : TMemoryStream; Jpg : TJpegImage; Bitmap : TBitmap; implementation procedure ExibeFoto(DataSet : TDataSet; BlobFieldName : String; ImageExibicao : TImage); begin if not(DataSet.IsEmpty) and not((DataSet.FieldByName(BlobFieldName) as TBlobField).IsNull) then try MemoryStream := TMemoryStream.Create; Jpg := TJpegImage.Create; (DataSet.FieldByName(BlobFieldName) as TBlobField).SaveToStream(MemoryStream); MemoryStream.Position := OffsetMemoryStream; Jpg.LoadFromStream(MemoryStream); ImageExibicao.Picture.Assign(Jpg); finally Jpg.Free; MemoryStream.Free; end else // o Else faz com que, caso o campo esteja Null, o TImage seja limpado ImageExibicao.Picture := Nil; end; procedure GravaFoto(DataSet : TDataSet; BlobFieldName, FileName : String); var ext : string; begin if (DataSet.State in [dsEdit,dsInsert]) then begin ext := UpperCase(ExtractFileExt(FileName)); if (ext <> '.BMP') and (ext <> '.JPG') and (ext <> '.JPEG') then begin raise EAccessViolation.Create('Formato de imagem não suportado! Formato suportado: Jpeg ou Bitmap'); Abort; end; try Jpg := TJpegImage.Create; MemoryStream := TMemoryStream.Create; Bitmap := TBitmap.Create; if (ext = '.BMP') then begin Bitmap.LoadFromFile(FileName); Jpg.Assign(Bitmap); Jpg.Compress; end else Jpg.LoadFromFile(FileName); Jpg.SaveToStream(MemoryStream); MemoryStream.Position := OffsetMemoryStream; (DataSet.FieldByName(BlobFieldName) as TBlobField).BlobType := ftTypedBinary; (DataSet.FieldByName(BlobFieldName) as TBlobField).LoadFromStream(MemoryStream); finally MemoryStream.Free; Bitmap.Free; Jpg.Free; end; end; end; procedure ExcluiFoto(DataSet : TDataSet; BlobFieldName : String); begin if (DataSet.State in [dsEdit,dsInsert]) and not((DataSet.FieldByName(BlobFieldName) as TBlobField).IsNull) then (DataSet.FieldByName(BlobFieldName) as TBlobField).Clear; // para limpar o TImage use // Image1.Picture := Nil; end; procedure ExportaFoto(DataSet : TDataSet; BlobFieldName, FileName : string; TipoImagem : TTipoImagem); begin // SERÁ IMPLEMENTADO FUTURAMENTE // ME FALTA TEMPO :) end; end. A linha de comando q estou usando no botão grava imagem é: If DataM.IbQuery.State in [DsEdit,Dsinsert] then GravaFoto(DataM.IbQuery,'IMAGEM',OpenPictureDialog1.FileName); // aqui seleciona uma jpg Obrigado desde já pelas dicas. DEUS É PAI. []'s Allan msn [EMAIL PROTECTED] Skype allan_gabriel Conheça o grupo OPEN PDV, acesse: http://br.groups.yahoo.com/group/OpenPDV [As partes desta mensagem que não continham texto foram removidas] -- <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> <*> Para ver as mensagens antigas, acesse: http://br.groups.yahoo.com/group/delphi-br/messages <*> Para falar com o moderador, envie um e-mail para: [EMAIL PROTECTED] Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/delphi-br/ <*> Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html