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

Delphi

19/03/2010

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

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

19/03/2010

tente seguir este tópico:

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

GOSTEI 0
Marcelo Cavalcanti

Marcelo Cavalcanti

19/03/2010

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)
GOSTEI 0
Jore

Jore

19/03/2010

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!
GOSTEI 0
Jore

Jore

19/03/2010

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'

GOSTEI 0
Marcelo Cavalcanti

Marcelo Cavalcanti

19/03/2010

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)
GOSTEI 0
Jore

Jore

19/03/2010

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!
GOSTEI 0
Jore

Jore

19/03/2010

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
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

19/03/2010

tente:

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

GOSTEI 0
Jore

Jore

19/03/2010

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!!
GOSTEI 0
Wilson Junior

Wilson Junior

19/03/2010

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.
GOSTEI 0
Jore

Jore

19/03/2010

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;
GOSTEI 0
Jore

Jore

19/03/2010

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;

GOSTEI 0
Thiago Santana

Thiago Santana

19/03/2010

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
GOSTEI 0
Wilson Junior

Wilson Junior

19/03/2010

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.
GOSTEI 0
Jore

Jore

19/03/2010

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;
GOSTEI 0
Thiago Santana

Thiago Santana

19/03/2010

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.Append; // Criando um mnovo registro        DmDados.ibTable.Fieldbyname(' CampoNome').asString := EditNome.text;        // Irá passar tds os campos que desejar gravar
      TBlobField(DMdados.ibtable1.FieldByName('IMGFRENTE')).LoadFromStream(MS);
      DMdados.ibtable1.Post;
    finally
      S.Free;
    end;
  finally
    MS.Free;
  end;

  end;
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

19/03/2010

não sei como você montou seu programa, mas não recomendo usar o append/insert. acho melhor você testar o estado do dataset antes de tentar manipular o campo de imagem.

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;

      if not (DMdados.ibtable1.State in [dsEdit, dsInsert]) then
        try
          DMdados.ibtable1.Edit;
        except
        end;

      if (DMdados.ibtable1.State in [dsEdit, dsInsert]) then
      begin
        TBlobField(DMdados.ibtable1.FieldByName('IMGFRENTE')).LoadFromStream(MS);
        DMdados.ibtable1.Post; // este Post é realmente necessário nesse momento?
      end
      else
        ShowMessage('Registro não está em modo de edição!');
    finally
      S.Free;
    end;
  finally
    MS.Free;
  end;

end;

GOSTEI 0
Jore

Jore

19/03/2010

Ola ThiiaGuinho

Veja o erro que deu no seu codigo...

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

  MS := TMemoryStream.Create;
  if openpicturedialog1.Execute then // Localizar imagem
  try
    S := TFileStream.Create(openpicturedialog1.FileName, fmOpenRead);
    try
      S.Position := 0;
      MS.LoadFromStream(S);
      MS.Seek(0, soFromBeginning);
      if (MS.Size = 0) then
        Exit;
       DMdados.ibtable1.Append; // Criando um mnovo registro
       DmDados.ibTable1.Fieldbyname(' imgfrente').asString := dbimage1.text;
       // Irá passar tds os campos que desejar gravar
      TBlobField(DMdados.ibtable1.FieldByName('IMGFRENTE')).LoadFromStream(MS);
      DMdados.ibtable1.Post;
    finally
      S.Free;
    end;
  finally
    MS.Free;
  end;

  end;

Onde esta escrito em vermelho eu coloquei o nome do DBImage1 que ia receber a imagem ta certo?
O erro esta na parte escrita em azul.
ESte erro: [Error] UNovo.pas(106): Undeclared identifier: 'text'

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

Ola Emerson
Tentei adicionar uma imagem jpeg com o seu código e deu este erro:



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

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

      if (MS.Size = 0) then
        Exit;

      if not (DMdados.ibtable1.State in [dsEdit, dsInsert]) then
        try
          DMdados.ibtable1.Edit;
        except
        end;

      if (DMdados.ibtable1.State in [dsEdit, dsInsert]) then
      begin
        TBlobField(DMdados.ibtable1.FieldByName('IMGFRENTE')).LoadFromStream(MS);
        DMdados.ibtable1.Post; // este Post é realmente necessário nesse momento?
      end
      else
        ShowMessage('Registro não está em modo de edição!');
    finally
      S.Free;
    end;
  finally
    MS.Free;
  end;

end;

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


Obrigado amigos! Nao me abandonem...


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

19/03/2010

para que o código funcione você terá de trabalhar com Image e não DBImage.
GOSTEI 0
Jore

Jore

19/03/2010

Amigo Emerson,
Como faço para ligar o Image no lugar do DBImage...digo os campos DataSource e DataField para o Image receber a imagem e depois para ela poder ser salva no Banco de dados.

Muito Obrigado pela ajuda de todos!
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

19/03/2010

você terá de fazer essa manipulação via código.
pode ser feito no evento AfterScroll do dataset. Ali você preenche o Image com o conteúdo do campo.
GOSTEI 0
Jore

Jore

19/03/2010

Ola Emerson,
Por um acaso voce teria um exemplo de como se faz isso? Como já disse sou novato e isso esta além de minhas forças.
Mesmo assim Obrigado!
GOSTEI 0
POSTAR