Alguém sabe como ler imagens da Base de Dados ?

Delphi

22/05/2007

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

Curtidas 0

Respostas

Gandalf.nho

Gandalf.nho

22/05/2007

Sete a propriedade Proportional do TImage como True.


GOSTEI 0
Nigro

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

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.


GOSTEI 0
Massuda

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.


GOSTEI 0
Ricvictor

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


GOSTEI 0
Gandalf.nho

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

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


GOSTEI 0
Massuda

Massuda

22/05/2007

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


GOSTEI 0
Ricvictor

Ricvictor

22/05/2007

No BD está definido como IMAGE.


GOSTEI 0
Ricvictor

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


GOSTEI 0
Ricvictor

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


GOSTEI 0
Massuda

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

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.


GOSTEI 0
Gandalf.nho

Gandalf.nho

22/05/2007

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


GOSTEI 0
Walfrido

Walfrido

22/05/2007

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


GOSTEI 0
Haroldobg

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 !


GOSTEI 0
Ericke Accyole

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
POSTAR