[Dúvida] Como Salvar Imagens no Banco de DAdos

19/03/2010

0

Olá amigos!

Sou novato em Programação e estou criando um pequeno projeto, onde tenho imagens que quero que sejam salvas no banco de dados no formato PNG.
Uso Delphi 7 com Firebird 2.1 com um campo BLOB para a imagem, Conexão Interbase com, (1 IBtable, 1 IBTransaction, 1 IBDatabase e 1 Datasource) Um Data Modulo.

Tnho um campo TDBImage com 1 TButton com o seguinte comando:

if DMTeste.ibtable1.state = dsBrowse then DMTeste.ibtable1.edit;
If openpicturedialog1.Execute then
Ifrente.Picture.LoadFromFile(openpicturedialog1.FileName);

Visualiza imagens bmp, wmf e emf. Porém só ta aceitando salvar bmp se eu puser os outros ao mandar salvar e atualizar a imagem some. Sera porque?

Quero salvar imagens do tipo PNG no Banco Firebird tem como? Qual seria o comando?

Já ouvi dizer que dá até para salvar jpeg, porém não tenho a minima ideia de como fazer...se alguém puder me ajudar ficarei muito agradecido.

Obrigado e aguardo o contato dos amigos!
Jore

Jore

Responder

Posts

22/03/2010

Emerson Nascimento

tente seguir este tópico:

http://forum.devmedia.com.br/viewtopic.php?t=65012

Responder

22/03/2010

Marcelo Cavalcanti

Tente algo assim:   var
  S: TStream;
  MS: TMemoryStream;
begin
...     MS := TMemoryStream.Create;
  if OPD.Execute then // Localizar imagem
  try
    S := TFileStream.Create(OPD.FileName, fmOpenRead);
    try
      S.Position := 0;
      MS.LoadFromStream(S);
      MS.Seek(0, soFromBeginning);
      if (MS.Size = 0) then
        Exit;
...
      TBlobField(DM.qUsuarios.FieldByName('IMAGEM')).LoadFromStream(MS);
      qUsuarios.Post;       finally
      S.Free;
    end;
  finally
    MS.Free;
  end;     Sds,   www.swg2.com.br (Transformando suas informações em dados gerenciais)
Responder

22/03/2010

Jore

Olá amigo Marcelo Rezende Cavalcanti,

Como eu disse sou novato em programação...fiz assim com o código que você postou:

Cliquei sobre o botão no TButton que tinha o seguinte comando:

if DMTeste.ibtable1.state = dsBrowse then DMTeste.ibtable1.edit;
If openpicturedialog1.Execute then
Ifrente.Picture.LoadFromFile(openpicturedialog1.FileName);

E coloquei o que você postou no lugar...
A principio deu erro nos três pontinhos que tem no código.
Ao retirar os três pontinhos e dar F9 deu outro erro é este:

[Error] UNovo.pas(96): Undeclared identifier: 'OPD'

Amigos, desculpem a minha falta de conhecimento, mais preciso muito da ajuda de vocês!
Responder

22/03/2010

Jore

Emerson, Seu link tem várias dicas! Porém não consegui com nenhuma...

Olha só:
Tentei este :
 begin
if DMDados.ibtable1.state = dsBrowse then DMdados.ibtable1.edit;
If openpicturedialog1.Execute then
DBImage1.Picture.LoadFromFile(openpicturedialog1.FileName);

if Opendialog1.Execute then
  begin
    DMDados.ibtable1.edit;
    dbimage1.Picture.LoadFromFile(Opendialog1.FileName);
    DMDados.ibtable1.LoadFromFile(Opendialog1.FileName);
  end;

end; 


E da este erro:

[Error] UNovo.pas(100): Undeclared identifier: 'LoadFromFile'

Responder

23/03/2010

Marcelo Cavalcanti

Jore, alguma dificuldade com o código que te enviei!!! Tenho certeza que você conseguirá, pois é do meu próprio aplicativo, com Firebird!!!   Sds,   Marcelo Rezende Cavalcanti
--------------------------------------------------------------------
www.swg2.com.br (Transformando suas informações em dados gerenciais)
Responder

23/03/2010

Jore

Olá amigo Marcelo Rezende Cavalcanti

Como eu disse sou novato em programação...fiz assim com o código que você postou:

Cliquei sobre o botão no TButton que tinha o seguinte comando:

if DMTeste.ibtable1.state = dsBrowse then DMTeste.ibtable1.edit;
If openpicturedialog1.Execute then
Ifrente.Picture.LoadFromFile(openpicturedialog1.FileName);

E coloquei o que você postou no lugar...
Este:

*****************************************************
var
  S: TStream;
  MS: TMemoryStream;
begin
...     MS := TMemoryStream.Create;
  if OPD.Execute then // Localizar imagem
  try
    S := TFileStream.Create(OPD.FileName, fmOpenRead);
    try
      S.Position := 0;
      MS.LoadFromStream(S);
      MS.Seek(0, soFromBeginning);
      if (MS.Size = 0) then
        Exit;
...
      TBlobField(DM.qUsuarios.FieldByName('IMAGEM')).LoadFromStream(MS);
      qUsuarios.Post;       finally
      S.Free;
    end;
  finally
    MS.Free;
  end;    *****************************************************
A principio deu erro nos três pontinhos que tem no código.
Ao retirar os três pontinhos e dar F9 deu outro erro é este:

[Error] UNovo.pas(96): Undeclared identifier: 'OPD'

Veja se pode me ajudar 8-))

Amigos, desculpem a minha falta de conhecimento, mais preciso muito da ajuda de vocês!
Responder

23/03/2010

Jore

Veja como esta o meu codigo:

procedure TFrmNovo.Button1Click(Sender: TObject);
var
  S: TStream;
  MS: TMemoryStream;
begin

  MS := TMemoryStream.Create;
  if openpicturedialog2.Execute then // Localizar imagem
  try
    S := TFileStream.Create(openpicturedialog2.FileName, fmOpenRead);
    try
      S.Position := 0;
      MS.LoadFromStream(S);
      MS.Seek(0, soFromBeginning);
      if (MS.Size = 0) then
        Exit;

      TBlobField(DMdados.ibtable1('IMAGEM')).LoadFromStream(MS);
      qUsuarios.Post;

    finally
      S.Free;
    end;
  finally
    MS.Free;
  end;


********************************************************************

Ta dando erro nesta linha:  TBlobField(DMdados.ibtable1('IMAGEM')).LoadFromStream(MS);

Seguinte mensagem: [Error] UNovo.pas(106): Missing operator or semicolon
Responder

24/03/2010

Emerson Nascimento

tente:

      TBlobField(DMdados.ibtable1.FieldByName('IMAGEM')).LoadFromStream(MS);
      DMdados.ibtable1.Post;

Responder

24/03/2010

Jore

Ola amigos,

Com a juda de vocês acho que j´já terei exito.
Bom, agora que o amigo Emerson, me ajudou com a correção do codigo, o programa já esta executando. Porem ainda da um erro. Vejam:

'Not in edit mode'



Meu codigo agora eh:

var
  S: TStream;
  MS: TMemoryStream;
begin

  MS := TMemoryStream.Create;
  if openpicturedialog2.Execute then // Localizar imagem
  try
    S := TFileStream.Create(openpicturedialog2.FileName, fmOpenRead);
    try
      S.Position := 0;
      MS.LoadFromStream(S);
      MS.Seek(0, soFromBeginning);
      if (MS.Size = 0) then
        Exit;

      TBlobField(DMdados.ibtable1.FieldByName('IMGFRENTE')).LoadFromStream(MS);
      DMdados.ibtable1.Post;

    finally
      S.Free;
    end;
  finally
    MS.Free;
  end;

  end; 


Como posso estar resolvendo este problema?

Obrigado pela ajuda amigos!!
Responder

24/03/2010

Wilson Junior

O registro da sua tabela "DMdados.ibtable1." deve estar em modo de edição (Edit) ou inclusão (Insert ou Append) para poder efetuar a gravação (Post).

Espero ter colaborado.
Responder

24/03/2010

Jore

Olá amigo
Você poderia me dizer em que parte do meu codigo eu devo locar este comando?
Pois coloquei nesta parte DMdados.ibtable1.Insert; depois tentei DMdados.ibtable1.Append; aqui e continuou dando erro.

Veja o codigo:

var
  S: TStream;
  MS: TMemoryStream;
begin

  MS := TMemoryStream.Create;
  if openpicturedialog2.Execute then // Localizar imagem
  try
    S := TFileStream.Create(openpicturedialog2.FileName, fmOpenRead);
    try
      S.Position := 0;
      MS.LoadFromStream(S);
      MS.Seek(0, soFromBeginning);
      if (MS.Size = 0) then
        Exit;

      TBlobField(DMdados.ibtable1.FieldByName('IMGFRENTE')).LoadFromStream(MS);
      DMdados.ibtable1.Post;

    finally
      S.Free;
    end;
  finally
    MS.Free;
  end;

  end;
Responder

24/03/2010

Jore

Olá amigo Lehapan,
Você poderia me dizer em que parte do meu codigo eu devo locar este comando?
Pois coloquei nesta parte DMdados.ibtable1.Insert; depois tentei DMdados.ibtable1.Append; aqui e continuou dando erro.

Veja o codigo:

var
  S: TStream;
  MS: TMemoryStream;
begin

  MS := TMemoryStream.Create;
  if openpicturedialog2.Execute then // Localizar imagem
  try
    S := TFileStream.Create(openpicturedialog2.FileName, fmOpenRead);
    try
      S.Position := 0;
      MS.LoadFromStream(S);
      MS.Seek(0, soFromBeginning);
      if (MS.Size = 0) then
        Exit;

      TBlobField(DMdados.ibtable1.FieldByName('IMGFRENTE')).LoadFromStream(MS);
      DMdados.ibtable1.Post;

    finally
      S.Free;
    end;
  finally
    MS.Free;
  end;

  end;

Responder

24/03/2010

Thiago Santana

S: TStream;
  MS: TMemoryStream;
begin

  MS := TMemoryStream.Create;
  if openpicturedialog2.Execute then // Localizar imagem
  try
    S := TFileStream.Create(openpicturedialog2.FileName, fmOpenRead);
    try
      S.Position := 0;
      MS.LoadFromStream(S);
      MS.Seek(0, soFromBeginning);
      if (MS.Size = 0) then
        Exit;             Dmdados.IbTable1.open; Dmdados.IbTable1.append; // <- Utilize um desse aí que irá resolver.       TBlobField(DMdados.ibtable1.FieldByName('IMGFRENTE')).LoadFromStream(MS);
      DMdados.ibtable1.Post;

    finally
      S.Free;
    end;
  finally
    MS.Free;
  end;

  end;

Espero ter ajudado!
AbraçoO
Responder

24/03/2010

Wilson Junior

1º - em qual registro você irá salvar a imagem? Se for um registro novo, deve ter outros campos nesta tabela que devem ser preenchidos;
2º - A sua tabela deve estar aberta (DMdados.ibtable1.Open);
3º - Esta rotina poderia somente atribuir a imagem para o campo "IMGFRENTE" e ser salvo na sua manutenção do registro.

Qualquer dúvida post aí.

Espero ter colaborado.
Responder

24/03/2010

Jore

Lehapan,

Tenho outros campos sim, como nome, tamanho... e ao acessar a imagem da erro porque esta apagando o conteudo dos outros campos.


Mesmo colocando assim da erro veja:

var
  S: TStream;
  MS: TMemoryStream;
begin

  MS := TMemoryStream.Create;
  if openpicturedialog2.Execute then // Localizar imagem
  try
    S := TFileStream.Create(openpicturedialog2.FileName, fmOpenRead);
    try
      S.Position := 0;
      MS.LoadFromStream(S);
      MS.Seek(0, soFromBeginning);
      if (MS.Size = 0) then
        Exit;
           DMdados.ibtable1.Open;
      TBlobField(DMdados.ibtable1.FieldByName('IMGFRENTE')).LoadFromStream(MS);
      DMdados.ibtable1.Post;

    finally
      S.Free;
    end;
  finally
    MS.Free;
  end;

  end;

ESte codigo abaixo eu usava antes. Porem ele não esta salvando imagens Jpeg e nem PNG apesar de me deixar vislualizar. So que na hora que clico em salvar a imagem some.

begin
if DMDados.ibtable1.state = dsBrowse then DMDados.ibtable1.edit;
If openpicturedialog1.Execute then
DBImage1.Picture.LoadFromFile(openpicturedialog1.FileName);
end;
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar