Alguém sabe como ler imagens da Base de Dados ?
Caro colega do forum
Estou com uma aplicação em Delphi 7 usando como plataforma para o Banco de Dados, o SQL SERVER.
Estou conseguindo armazenar a imagem, porém quando vou lê o campo a imagem está vindo cortada. Descobri que a bronca está no tamanho da imagem. Se eu armazenar uma imagem de até 20Kb, não tem problema ... mas tamanho superior, já corta a imagem. Lógico que não é viável ficar armazenando imagens grandes, mas uma imagem de até 100Kb não vai comprometer minha aplicação não.
ALGUNS DOS COLEGAS DE PROFISSÃO PODERIA ME AJUDAR ?? SABERIA COMO RESOLVO ESSA QUESTÃO DO TAMANHO ??
Segue abaixo a rotina que estou usando no momento. :?
procedure TFrmFuncionario.DSFuncionarioDataChange(Sender: TObject;
Field: TField);
var
CampoBlob:TBlobStream;
ImgJpeg:TJPEGImage;
begin
if QyFuncionarioFoto.AsString <> ´´ Then
begin
CampoBlob := TBlobStream.Create(QyFuncionarioFoto,BmRead);
ImgJpeg := TJPEGImage.Create;
if CampoBlob.Size > 1 then
begin
CampoBlob.Position:=0;
ImgJpeg.LoadFromStream(CampoBlob);
Image1.Picture.Assign(ImgJpeg);
end;
CampoBlob.Free;
ImgJpeg.Free;
end
else
Image1.Picture := nil;
end;
Desde já, agradeço a todos.
Ricardo
Estou com uma aplicação em Delphi 7 usando como plataforma para o Banco de Dados, o SQL SERVER.
Estou conseguindo armazenar a imagem, porém quando vou lê o campo a imagem está vindo cortada. Descobri que a bronca está no tamanho da imagem. Se eu armazenar uma imagem de até 20Kb, não tem problema ... mas tamanho superior, já corta a imagem. Lógico que não é viável ficar armazenando imagens grandes, mas uma imagem de até 100Kb não vai comprometer minha aplicação não.
ALGUNS DOS COLEGAS DE PROFISSÃO PODERIA ME AJUDAR ?? SABERIA COMO RESOLVO ESSA QUESTÃO DO TAMANHO ??
Segue abaixo a rotina que estou usando no momento. :?
procedure TFrmFuncionario.DSFuncionarioDataChange(Sender: TObject;
Field: TField);
var
CampoBlob:TBlobStream;
ImgJpeg:TJPEGImage;
begin
if QyFuncionarioFoto.AsString <> ´´ Then
begin
CampoBlob := TBlobStream.Create(QyFuncionarioFoto,BmRead);
ImgJpeg := TJPEGImage.Create;
if CampoBlob.Size > 1 then
begin
CampoBlob.Position:=0;
ImgJpeg.LoadFromStream(CampoBlob);
Image1.Picture.Assign(ImgJpeg);
end;
CampoBlob.Free;
ImgJpeg.Free;
end
else
Image1.Picture := nil;
end;
Desde já, agradeço a todos.
Ricardo
Ricvictor
Curtidas 0
Respostas
Gandalf.nho
22/05/2007
Sete a propriedade Proportional do TImage como True.
GOSTEI 0
Nigro
22/05/2007
Com o tempo tive alguns problemas com relação ao tamanho do banco por conter imagens, eu prefiro salvar o path e ler em run time.
GOSTEI 0
Ricvictor
22/05/2007
Coloquei a propriedade ´proportional´ do TImage para TRUE, mas não funcionou ... continua cortando a imagem :( Há alguma outra coisa que possamos fazer para testar ?
Valeu. Um abraço.
Ricardo.
Valeu. Um abraço.
Ricardo.
GOSTEI 0
Massuda
22/05/2007
O que você quer dizer com ´cortando a imagem´?
Se você quer dizer que apenas parte da imagem aparece, experimente fazer TImage.Stretch = True para forçar a imagem ser do tamanho do TImage (grande chance de distorcer a imagem) ou faça TImage.AutoSize = True para forçar o TImage ser do tamanho da imagem.
Se você quer dizer que apenas parte da imagem aparece, experimente fazer TImage.Stretch = True para forçar a imagem ser do tamanho do TImage (grande chance de distorcer a imagem) ou faça TImage.AutoSize = True para forçar o TImage ser do tamanho da imagem.
GOSTEI 0
Ricvictor
22/05/2007
Pow Massuda, te agradeço por abraçar essa minha causa :)
Seguinte ... quando eu gravo a imagem, logo após o post na query, a imagem (foto) que fica me mostrando no TImage está perfeita. Mas quando eu chamo novamente o funcionário, a tela, a imagem que me mostra (a que é colocada) no TImage (de cima pra baixo) preenche com a foto até a metade do TImage. Do meio para baixo fica cinza.
Já deixo setada a propriedade ´Strech´, não distorcendo a imagem na visualização pós gravação, para TRUE.
Fico no aguardo, para saber se você conseguiu entender a minha bronca e assim me ajudar com alguma outra dica.
Valeu msm. Abraço. Ricardo
Seguinte ... quando eu gravo a imagem, logo após o post na query, a imagem (foto) que fica me mostrando no TImage está perfeita. Mas quando eu chamo novamente o funcionário, a tela, a imagem que me mostra (a que é colocada) no TImage (de cima pra baixo) preenche com a foto até a metade do TImage. Do meio para baixo fica cinza.
Já deixo setada a propriedade ´Strech´, não distorcendo a imagem na visualização pós gravação, para TRUE.
Fico no aguardo, para saber se você conseguiu entender a minha bronca e assim me ajudar com alguma outra dica.
Valeu msm. Abraço. Ricardo
GOSTEI 0
Gandalf.nho
22/05/2007
Talvez a imagem já esteja sendo gravada de maneira incompleta. Ela cabe direitinho no TImage sem precisar redimensionar?
GOSTEI 0
Ricvictor
22/05/2007
Olá gandalf.nho
É provável também que isto esteja acontecendo sim. A gravação, estou fazendo assim:
procedure TFrmFuncionario.Image1DblClick(Sender: TObject);
var
CampoBlob:TBlobStream;
ImgJpeg:TJPEGImage;
begin
if QyFuncionario.RecordCount > 0 then
begin
Foto.Execute;
if Foto.FileName <> ´´ then
begin
QyFuncionario.Edit;
CampoBlob:= TBlobStream.Create(QyFuncionarioFoto,BmWrite);
ImgJpeg:= TJPEGImage.Create;
ImgJpeg.LoadFromFile(Foto.FileName);
ImgJpeg.SaveToStream(CampoBlob);
Image1.Picture.Assign(ImgJpeg);
CampoBlob.Free;
ImgJpeg.Free;
QyFuncionario.Post;
end;
end
else
MessageDlg(´Não há ainda nenhum funcionário cadastrado.´+#13+
´Cadastramento de foto não disponível.´, mtWarning, [mbOK], 0);
end;
Alguma idéia, caso você esteja certo, para tentarmos solucionar ?
Obrigado. Um abraço. Ricardo
É provável também que isto esteja acontecendo sim. A gravação, estou fazendo assim:
procedure TFrmFuncionario.Image1DblClick(Sender: TObject);
var
CampoBlob:TBlobStream;
ImgJpeg:TJPEGImage;
begin
if QyFuncionario.RecordCount > 0 then
begin
Foto.Execute;
if Foto.FileName <> ´´ then
begin
QyFuncionario.Edit;
CampoBlob:= TBlobStream.Create(QyFuncionarioFoto,BmWrite);
ImgJpeg:= TJPEGImage.Create;
ImgJpeg.LoadFromFile(Foto.FileName);
ImgJpeg.SaveToStream(CampoBlob);
Image1.Picture.Assign(ImgJpeg);
CampoBlob.Free;
ImgJpeg.Free;
QyFuncionario.Post;
end;
end
else
MessageDlg(´Não há ainda nenhum funcionário cadastrado.´+#13+
´Cadastramento de foto não disponível.´, mtWarning, [mbOK], 0);
end;
Alguma idéia, caso você esteja certo, para tentarmos solucionar ?
Obrigado. Um abraço. Ricardo
GOSTEI 0
Massuda
22/05/2007
Como está definido no BD o campo que recebe a imagem?
GOSTEI 0
Ricvictor
22/05/2007
No BD está definido como IMAGE.
GOSTEI 0
Ricvictor
22/05/2007
Amigos do Forum, a saga continua infelizmente !! :( Por achar que não fui um tanto claro no meu problema, relato aqui mais uma vez ...
Estou com uma aplicação em Delphi 7 usando como plataforma para o Banco de Dados, o SQL SERVER. O campo da imagem no BD é do tipo IMAGE.
Estou conseguindo armazenar a imagem, porém quando vou lê o campo a imagem está vindo cortada. Descobri que a bronca está no tamanho da imagem. Se eu armazenar uma imagem de até 20Kb, não tem problema ... mas com tamanho superior, já corta a imagem. Me parece gravar só parte da imagem. Ou seja, a imagem já pode estar sendo gravada cortada ou a bronca é somente na leitura. Em outras palavras, na leitura do campo o TImage só mostra a foto corretamente (de cima pra baixo) só até a metade do TImage. Da metade pra baixo, fica cinza. Lógico que não é viável ficar armazenando imagens grandes, mas uma imagem de até 150Kb não vai comprometer minha aplicação não.
ALGUNS DOS COLEGAS DE PROFISSÃO PODERIA ME AJUDAR ?? SABERIA COMO RESOLVO ESSA QUESTÃO DO TAMANHO ??
Segue abaixo as rotinas de leitura e gravação da imagem no BD que estou usando no momento.
//Lendo a imagem
procedure TFrmFuncionario.DSFuncionarioDataChange(Sender: TObject;
Field: TField);
var
CampoBlob:TBlobStream;
ImgJpeg:TJPEGImage;
begin
if QyFuncionarioFoto.AsString <> ´´ Then
begin
CampoBlob := TBlobStream.Create(QyFuncionarioFoto,BmRead);
ImgJpeg := TJPEGImage.Create;
if CampoBlob.Size > 1 then
begin
CampoBlob.Position:=0;
ImgJpeg.LoadFromStream(CampoBlob);
Image1.Picture.Assign(ImgJpeg);
end;
CampoBlob.Free;
ImgJpeg.Free;
end
else
Image1.Picture := nil;
end;
//Gravando a imagem
procedure TFrmFuncionario.Image1DblClick(Sender: TObject);
var
CampoBlob:TBlobStream;
ImgJpeg:TJPEGImage;
begin
if QyFuncionario.RecordCount > 0 then
begin
Foto.Execute;
if Foto.FileName <> ´´ then
begin
QyFuncionario.Edit;
CampoBlob:= TBlobStream.Create(QyFuncionarioFoto,BmWrite);
ImgJpeg:= TJPEGImage.Create;
ImgJpeg.LoadFromFile(Foto.FileName);
ImgJpeg.SaveToStream(CampoBlob);
Image1.Picture.Assign(ImgJpeg);
CampoBlob.Free;
ImgJpeg.Free;
QyFuncionario.Post;
end;
end
else
MessageDlg(´Não há ainda nenhum funcionário cadastrado.´+#13+
´Cadastramento de foto não disponível.´, mtWarning, [mbOK], 0);
end;
Bom, é isso ... espero que os amigos me ajude nessa questão. Desde já, agradeço a todos.
Ricardo
Estou com uma aplicação em Delphi 7 usando como plataforma para o Banco de Dados, o SQL SERVER. O campo da imagem no BD é do tipo IMAGE.
Estou conseguindo armazenar a imagem, porém quando vou lê o campo a imagem está vindo cortada. Descobri que a bronca está no tamanho da imagem. Se eu armazenar uma imagem de até 20Kb, não tem problema ... mas com tamanho superior, já corta a imagem. Me parece gravar só parte da imagem. Ou seja, a imagem já pode estar sendo gravada cortada ou a bronca é somente na leitura. Em outras palavras, na leitura do campo o TImage só mostra a foto corretamente (de cima pra baixo) só até a metade do TImage. Da metade pra baixo, fica cinza. Lógico que não é viável ficar armazenando imagens grandes, mas uma imagem de até 150Kb não vai comprometer minha aplicação não.
ALGUNS DOS COLEGAS DE PROFISSÃO PODERIA ME AJUDAR ?? SABERIA COMO RESOLVO ESSA QUESTÃO DO TAMANHO ??
Segue abaixo as rotinas de leitura e gravação da imagem no BD que estou usando no momento.
//Lendo a imagem
procedure TFrmFuncionario.DSFuncionarioDataChange(Sender: TObject;
Field: TField);
var
CampoBlob:TBlobStream;
ImgJpeg:TJPEGImage;
begin
if QyFuncionarioFoto.AsString <> ´´ Then
begin
CampoBlob := TBlobStream.Create(QyFuncionarioFoto,BmRead);
ImgJpeg := TJPEGImage.Create;
if CampoBlob.Size > 1 then
begin
CampoBlob.Position:=0;
ImgJpeg.LoadFromStream(CampoBlob);
Image1.Picture.Assign(ImgJpeg);
end;
CampoBlob.Free;
ImgJpeg.Free;
end
else
Image1.Picture := nil;
end;
//Gravando a imagem
procedure TFrmFuncionario.Image1DblClick(Sender: TObject);
var
CampoBlob:TBlobStream;
ImgJpeg:TJPEGImage;
begin
if QyFuncionario.RecordCount > 0 then
begin
Foto.Execute;
if Foto.FileName <> ´´ then
begin
QyFuncionario.Edit;
CampoBlob:= TBlobStream.Create(QyFuncionarioFoto,BmWrite);
ImgJpeg:= TJPEGImage.Create;
ImgJpeg.LoadFromFile(Foto.FileName);
ImgJpeg.SaveToStream(CampoBlob);
Image1.Picture.Assign(ImgJpeg);
CampoBlob.Free;
ImgJpeg.Free;
QyFuncionario.Post;
end;
end
else
MessageDlg(´Não há ainda nenhum funcionário cadastrado.´+#13+
´Cadastramento de foto não disponível.´, mtWarning, [mbOK], 0);
end;
Bom, é isso ... espero que os amigos me ajude nessa questão. Desde já, agradeço a todos.
Ricardo
GOSTEI 0
Ricvictor
22/05/2007
aahhh ... antes que eu me esqueça ... a propriedade do TImage Strech já está setada para TRUE. Testei também já com a propriedade Proportional, setando ela para TRUE também, mas não ajeitou o lance da imagem. Continua cortando ... :(
Um abraço. Ricardo
Um abraço. Ricardo
GOSTEI 0
Massuda
22/05/2007
Não manjo de BD, mas imagino que ajuda se você informar qual componente de acesso está utilizando.
GOSTEI 0
Ricvictor
22/05/2007
Oi Massuda, é válido informar sim. Valeu pela lembrança ... então, vamos lá ...
Os componentes que estou utilizando na aplicação que são usados para conexão com o BD são ... TDatabase, TQuery (BDE).
Espero que os amigos consigam me ajudar ...
Um abraço. Ricardo.
Os componentes que estou utilizando na aplicação que são usados para conexão com o BD são ... TDatabase, TQuery (BDE).
Espero que os amigos consigam me ajudar ...
Um abraço. Ricardo.
GOSTEI 0
Gandalf.nho
22/05/2007
Já experimentou testar isso com outros componentes de acesso como ADO ou DBExpress?
GOSTEI 0
Walfrido
22/05/2007
Porque você não tenta limpar o TImage antes jogar a nova imagem... acho que resolve.
GOSTEI 0
Haroldobg
22/05/2007
Boa noite meu amigo,
Nao sei se vc já resolveu esse problema, mas como nao achei uma resposta sobre isso, vai uma dica:
Dá uma olhada no sua BDE, pois existe uma variavel chamda BLOB_SIZE.
Ela vem setada com 64.
Vc pode ir aumentando ate te atender.
Espero ter ajudado !
Boa sorte !
Nao sei se vc já resolveu esse problema, mas como nao achei uma resposta sobre isso, vai uma dica:
Dá uma olhada no sua BDE, pois existe uma variavel chamda BLOB_SIZE.
Ela vem setada com 64.
Vc pode ir aumentando ate te atender.
Espero ter ajudado !
Boa sorte !
GOSTEI 0
Ericke Accyole
22/05/2007
Galera, eu estava com o mesmo problema, pega a imagem do banco de dados e so carregava uma parte da imagem, mas com o Stretch funcionou de boas. vlw
GOSTEI 0