Registriert seit: 30. Mai 2008
407 Beiträge
Lazarus
|
Stream Lesefehler
27. Jun 2008, 17:53
Hmm ich seh den Fehler nicht, vielleicht weiß wer von euch weiter.
Folgender Code funktioniert einwandfrei, während die Stream-Variante eine Exception bei jedem ReadBuffer auswirft mit der Meldung Stream-Lesefehler.
Delphi-Quellcode:
type
TTGAFile = record
iType: byte; // should be 2
w, h: word; // Width, Height
bpp: byte; // Byte per Pixel
data: ^byte; // Pixels, dynamic length
end;
procedure LoadTGA(const filename: string; var TGAFile: TTGAFile);
var f: file; bytes: longword;
begin
assign(f, filename);
reset(f, 1);
// type
seek(f, 2);
blockread(f, TGAFile.iType, 1);
// w, h, bpp
seek(f, 12);
blockread(f, TGAFile.w, 5);
TGAFile.bpp := TGAFile.bpp div 8;
// data
bytes := TGAFile.w * TGAFile.h * TGAFile.bpp;
getmem(TGAFile.data, bytes);
seek(f, 18);
blockread(f, TGAFile.data^, bytes);
close(f);
end;
Stream-Variante, TTGAImage ist mit TTGAFile identisch und lediglich umbenannt:
Delphi-Quellcode:
procedure LoadTGA(const filename: string; var TGAImage: TTGAImage);
var
FStream: TFileStream;
ImageSize: longword;
begin
FStream := TFileStream.Create(filename, fmOpenRead);
try
//iType
FStream.Seek(soFromBeginning, 2);
FStream.ReadBuffer(TGAImage.iType, 1);
//w, h, bpp
FStream.Seek(soFromBeginning, 12);
FStream.ReadBuffer(TGAImage.w, 5);
TGAImage.bpp := TGAImage.bpp div 8;
//Data
ImageSize := TGAImage.w * TGAImage.h * TGAImage.bpp;
GetMem(TGAImage.data, ImageSize);
FStream.Seek(soFromBeginning, 18);
FStream.ReadBuffer(TGAImage.data^, ImageSize);
finally
FStream.Free;
end;
end;
|
|
Zitat
|