Fórum Salvar Jpg dentro em um bytea no Postgres 9.2 e exibi-la #427609

30/10/2012

0

Olá Pessoal, gostaria de uma ajuda de vocês para resolver uma questão que me intriga, confesso que já procurei na net e testei vários exemplos de como salvar uma imagem jpg no postgres 9.x e exibi-la num timage, só que nenhuma exibe. Salvar até que salva, o problema está em exibir. Vamos ao meu problema:

Na minha aplicação eu capturo uma imagem através de uma camera e salvo em um local no disco no formato .jpg, em seguida, tenho que gravar a imagem em um campo bytea dentro do postgres 9.2.

Eu até que consigo gravar utilizando o código:

query.ParamByName(''imagem'').LoadFromFile(ExtractFileDir(application.ExeName)+''/temp/img001.jpg'',ftGraphic);
query.ExecSQL;

o problema está na hora de exibir, já tentei de tudo, e detalhe, o mesmo código abaixo funcionava quando usava postgres 8.4, só foi mudar para 9.2 que começou a dar o erro #53:

qImagem.SQL.Text:=''select * from imagens.clientes where cliente=''+qClientesid.AsString+'';'';
qImagem.ExecSQL;
Atualizar(qImagem);//

im:=TMemoryStream.Create();
TBlobField(qImagem.FieldByName(''imagem'')).SaveToStream(im);
img:=TJPEGImage.Create;
img.LoadFromStream(im);

Image1.Picture.Assign(img); //TImage




Acredito que esteja dando incompatibilidade com o encoding do banco ''utf8''.
Pensando que o problema poderia estar no procedimento no delphi que faz a inserção da imagem no banco, inseri diretamente no banco um jpg(criado no paint) no campo bytea do postgres e dá a seguinte mensagem "invalid bytea sequence for encoding UTF8: oxff.

Se o problema for em relação a codificação o que posso fazer, pois tenho que utilizar o utf8, se não, como posso inserir uma imagem de tipo jpg em um campo bytea no postgres 9.x.

Alguém pode me ajudar? desde já muito obrigado.
Carlos Santana

Carlos Santana

Responder

Posts

30/10/2012

Claudia Nogueira

Pra gravar você pode usar dessa forma:
procedure TForm2.Button1Click(Sender: TObject);
var
  Imagem: TFileStream;
begin
  Imagem := TFileStream.Create(ExtractFileDir(application.ExeName)+'/temp/img001.jpg', fmOpenRead or fmShareDenyWrite);
  //Iniciar transação
  qImagem.Close;
  qImagem.ParamByName('logotipo').LoadFromStream(Imagem,ftBlob);
  qImagem.ExecSQL;
  //Commitar transação
end;


Utilizar essa função quando for usar pra mostrar a imagem:

function TForm2.LoadImage(AImage: TImage; ABlobField: TBlobField): Boolean;
var
  JpgImg: TJPEGImage;
  StMem: TMemoryStream;
begin
  if ABlobField.DataSet.IsEmpty then
  begin
    Result := False;
    Exit;
  end;

  AImage.Picture.Assign(nil);
  if not (ABlobField.IsNull) and not (ABlobField.AsString = '') then
  begin
    jpgImg := TJPEGImage.Create;
    stMem := TMemoryStream.Create;
    try
      ABlobField.SaveToStream(StMem);
      StMem.Position := 0;
      JpgImg.LoadFromStream(StMem);
      AImage.Picture.Assign(JpgImg);
    finally
      StMem.Free;
      JpgImg.Free;
    end;
  end;
  Result := True;
end;


Esse código pra mostrar a imagem:

  qImagem.Close;
  qImagem.SQL.Text:='select * from imagens.clientes where cliente=' + QuotedStr(qClientesid.AsString);
  qImagem.Open;
  if not qImagem.IsEmpty then
    LoadImage(Image1, TBlobField(qImagem.FieldByName('imagem')));


Obs.: Adicionar JPEG nos uses do Form e um componente TImage pra testar.
Responder

Gostei + 0

30/10/2012

Claudia Nogueira

Cometi um erro de digitação.
Onde estiver 'logotipo' você tem que trocar pelo nome do seu campo.
Responder

Gostei + 0

30/10/2012

Carlos Santana

Não funcionou, dá um erro de exceção EJPEG com mensagem : "JPEG error #53" na linha:
JpgImg.LoadFromStream(StMem);

Só para testar eu criei um jpg no MsPaint e salvei no diretório e fiz o delphi gravar no banco conforme a sugestão, e depois tentei carregar e dá o mesmo erro citado acima.

Acredito que o delphi não esteja conseguindo gravar corretamente a imagem como UTF8, será que pode ser isso ? Pois de qualquer forma o delphi não consegue carregar a imagem pois não tem como retorno um jpg válido.

Existe alguma forma de tentar gravar a imagem como UTF8 no banco ?
Responder

Gostei + 0

30/10/2012

Claudia Nogueira

O estranho é que antes de te enviar eu criei uma nova base com UTF8 e uma tabela com o campo bytea.
Fiz o projeto do zero e inseri várias imagens e também coloquei um botão pra carregar da tabela e mostrar no TImage.
Tem Jpeg no Uses do Form?

Não funcionou, dá um erro de exceção EJPEG com mensagem : "JPEG error #53" na linha:
JpgImg.LoadFromStream(StMem);

Só para testar eu criei um jpg no MsPaint e salvei no diretório e fiz o delphi gravar no banco conforme a sugestão, e depois tentei carregar e dá o mesmo erro citado acima.

Acredito que o delphi não esteja conseguindo gravar corretamente a imagem como UTF8, será que pode ser isso ? Pois de qualquer forma o delphi não consegue carregar a imagem pois não tem como retorno um jpg válido.

Existe alguma forma de tentar gravar a imagem como UTF8 no banco ?
Responder

Gostei + 0

30/10/2012

Carlos Santana

Entendi, mas você está utilizando postgres 9.x ?
Estou fazendo esse teste em um windows 7, com delphi xe2 e zeos 7 e postgres 9.2.

Responder

Gostei + 0

30/10/2012

Bruno Leandro

carlos nao cheguei a testar o exemplo passado mas aqui tambem tive problema neste cenario que voce colocou, e pra resolver comecei a gravar em campo tipo text
Responder

Gostei + 0

30/10/2012

Bruno Leandro

completando... gravava normalmente, mas na hora de abrir dava um erro.
Responder

Gostei + 0

31/10/2012

Claudia Nogueira

A única diferença no cenário é que eu uso o PgDac no lugar do zeos.

Entendi, mas você está utilizando postgres 9.x ?
Estou fazendo esse teste em um windows 7, com delphi xe2 e zeos 7 e postgres 9.2.

Responder

Gostei + 0

01/11/2012

Claudia Nogueira

Fiquei pensando o motivo de aqui funcionar e aí não. Testei em duas máquinas diferentes e aqui funciona.
Instalei a última versão do Zeos no meu Delphi XE e fiz o exemplo de uma galeria de fotos com PostgreSQL 9x.
Segue o código fonte.
Testei em duas máquinas esse projeto e funcionou.

[url]http://www.cdnweb.com.br/ExemploFotos.rar[/url]
Responder

Gostei + 0

01/11/2012

Claudia Nogueira

Tem um backup do banco de dados usado no exemplo no arquivo compactado.
Responder

Gostei + 0

02/11/2012

Carlos Santana

Claudia,

eu acredito que seja a versão do Zeos que estou utilizando!
Quando abri o seu projeto, a primeira coisa que aparece é uma mensagem de Erro em relação ao componente Zconnection, dizendo que a propriedade UTF8StringsAsWideField não existe, e outra coisa, na lista de protocolos do Zconnection aparece postgres-9, no meu só o postgres-8. Então acredito que estou com versão do zeos desatualizada.

Você tem o link de onde baixou/instalou a última versão do zeos? se tiver me manda pois vou fazer o teste.
Desde já agradeço pela ajuda.
Responder

Gostei + 0

02/11/2012

Carlos Santana

Claudia,

eu acredito que seja a versão do Zeos que estou utilizando!
Quando abri o seu projeto, a primeira coisa que aparece é uma mensagem de Erro em relação ao componente Zconnection, dizendo que a propriedade UTF8StringsAsWideField não existe, e outra coisa, na lista de protocolos do Zconnection aparece postgres-9, no meu só o postgres-8. Então acredito que estou com versão do zeos desatualizada.

Você tem o link de onde baixou/instalou a última versão do zeos? se tiver me manda pois vou fazer o teste.
Desde já agradeço pela ajuda.


Era exatamente isso, removi a versão do zeos 7 que tinha e baixei e instalei a última versão do projeto ZeosLib em http://sourceforge.net/projects/zeoslib/files/Zeos%20Database%20Objects/, daí tudo funcionou perfeitamente....hehehehe
Agradeço a todos pela ajuda.
Responder

Gostei + 0

02/11/2012

Luciano Santos

Olha, "né por nada, não", mas, com esse projeto da devmedia de recompensa$$ar as pessoas que ajudam no fórum, eu acho que deveriam pagar hora extra para Claudinha, vocês não acham, não? rsrsrsrs. E a 100%! Sério, vejo como está garota ajuda e se esforça para solucionar as dificuldades dos outros. Congratulações, Cláudia.
Responder

Gostei + 0

02/11/2012

Luciano Santos

Olha, "né por nada, não", mas, com esse projeto da devmedia de recompensa$$ar as pessoas que ajudam no fórum, eu acho que deveriam pagar hora extra para Claudinha, vocês não acham, não? rsrsrsrs. E a 100%! Sério, vejo como está garota ajuda e se esforça para solucionar as dificuldades dos outros. Congratulações, Cláudia.
Responder

Gostei + 0

02/11/2012

Carlos Santana

Com certeza, apoio total! o que vemos por ai é o pessoal respondendo o forum só para aparecer, e na maioria das vezes nem tenta ajudar de verdade, passa qualquer link encontrado na web e "se vira". A Claudia colocou exemplos da forma mais clara possível! Muito obrigado a todos e Parabéns Claudia...rsrsrsrs
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar