[Dúvida] Como Salvar Imagens no Banco de DAdos
19/03/2010
0
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
Posts
22/03/2010
Emerson Nascimento
http://forum.devmedia.com.br/viewtopic.php?t=65012
22/03/2010
Marcelo Cavalcanti
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)
22/03/2010
Jore
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!
22/03/2010
Jore
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'
23/03/2010
Marcelo Cavalcanti
--------------------------------------------------------------------
www.swg2.com.br (Transformando suas informações em dados gerenciais)
23/03/2010
Jore
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!
23/03/2010
Jore
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
24/03/2010
Emerson Nascimento
TBlobField(DMdados.ibtable1.FieldByName('IMAGEM')).LoadFromStream(MS);
DMdados.ibtable1.Post;
24/03/2010
Jore
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!!
24/03/2010
Wilson Junior
Espero ter colaborado.
24/03/2010
Jore
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;
24/03/2010
Jore
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;
24/03/2010
Thiago Santana
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
24/03/2010
Wilson Junior
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.
24/03/2010
Jore
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;
Clique aqui para fazer login e interagir na Comunidade :)