GARANTIR DESCONTO

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.

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

Kohl

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:
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):
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; 
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.


Responder

Gostei + 0

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

Aceitar