Fórum Alguém sabe como ler imagens da Base de Dados ? #342152

22/05/2007

0

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


Ricvictor

Ricvictor

Responder

Posts

22/05/2007

Gandalf.nho

Sete a propriedade Proportional do TImage como True.


Responder

Gostei + 0

22/05/2007

Nigro

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.


Responder

Gostei + 0

22/05/2007

Ricvictor

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.


Responder

Gostei + 0

22/05/2007

Massuda

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.


Responder

Gostei + 0

22/05/2007

Ricvictor

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


Responder

Gostei + 0

22/05/2007

Gandalf.nho

Talvez a imagem já esteja sendo gravada de maneira incompleta. Ela cabe direitinho no TImage sem precisar redimensionar?


Responder

Gostei + 0

22/05/2007

Ricvictor

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


Responder

Gostei + 0

22/05/2007

Massuda

Como está definido no BD o campo que recebe a imagem?


Responder

Gostei + 0

22/05/2007

Ricvictor

No BD está definido como IMAGE.


Responder

Gostei + 0

23/05/2007

Ricvictor

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


Responder

Gostei + 0

23/05/2007

Ricvictor

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


Responder

Gostei + 0

24/05/2007

Massuda

Não manjo de BD, mas imagino que ajuda se você informar qual componente de acesso está utilizando.


Responder

Gostei + 0

24/05/2007

Ricvictor

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.


Responder

Gostei + 0

24/05/2007

Gandalf.nho

Já experimentou testar isso com outros componentes de acesso como ADO ou DBExpress?


Responder

Gostei + 0

18/09/2007

Walfrido

Porque você não tenta limpar o TImage antes jogar a nova imagem... acho que resolve.


Responder

Gostei + 0

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

Aceitar