Fórum Arquivos não-texto #276925
12/04/2005
0
Fiz o seguinte codigo que deve gravar um bitmap e alguns dados em texto num arquivo binario, mas ele nao esta gravando a imagem, so o texto.
Obrigado
Type TMeusDados = record Nome: String[100]; Capa: TBitmap; end; var ArqDados: File of TMeusDados; MeusDados: TMeusDados; begin AssignFile(ArqDados, ´C:\dados.dat´); if not FileExists(´C:\dados.dat´) then ReWrite(ArqDados) else Reset(ArqDados); try MeusDados.Nome := ´The Prodigy´; MeusDados.Capa := Image1.Canvas.Bitmap; Write(ArqDados, MeusDados);//Escreve informações finally CloseFile(ArqDados); end; end;
Obrigado
Kohl
Curtir tópico
+ 0
Responder
Posts
12/04/2005
Beppe
É que a imagem é, na verdade, apenas um ponteiro para os pixels. Da forma que vc está gravando, é este ponteiro(o endereço dos pixels) que é gravado, 4 bytes no total.
O tipo [b:6612eaafc6]file of[/b:6612eaafc6] não é muito flexível, por isso deve abandoná-lo em favor de descendentes de TStream.
Seria algo assim:
:wink:
O tipo [b:6612eaafc6]file of[/b:6612eaafc6] não é muito flexível, por isso deve abandoná-lo em favor de descendentes de TStream.
Seria algo assim:
var ArqDados: TStream; MeusDados: TMeusDados; begin ArqDados := TFileStream.Create(´C:\dados.dat´, fmCreate); try MeusDados.Nome := ´The Prodigy´; MeusDados.Capa := Image1.Canvas.Bitmap; ArqDados.Write(MeusDados.Nome[0], SizeOf(MeusDados.Nome)); MeusDados.Capa.SaveToStream(ArqDados); finally ArqDados.Free; end; end;
:wink:
Responder
Gostei + 0
12/04/2005
Massuda
Isso acontece porque TMeusDados.Capa é apenas a referência para o objeto TBitmap que você está usando (acho que cada arquivo seu deve ter agora uns 100-110 bytes).
Para gravar um nome e uma imagem em um arquivo, você teria que usar algo assim (não testei):Para ler de volta a imagem use TBitmap.LoadFromStream e para ler de volta o nome dê uma olhada neste [url=http://forum.clubedelphi.net/viewtopic.php?t=57027]tópico anterior[/url] do fórum.
Para gravar um nome e uma imagem em um arquivo, você teria que usar algo assim (não testei):
procedure Gravar(NomeDoArquivo, Nome: string; Imagem: TBitmap); var Stream: TFileStream; N: Integer; begin Stream := TFileStream.Create(NomeDoArquivo, fmCreate); // grava o nome N := Length(Nome); Stream.Write(N, SizeOf(N)); // tamanho if N > 0 then Stream.Write(Nome[1], N); // grava a imagem Imagem.SaveToStream(Stream); Stream.Free; end;
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)