Ich hab mir mal dein Bitmap angeschaut und die Header sind eigentlich korrekt und auch die Farbwerte sind richtig abgespeichert in
RGB, aber Delphi beachtet offenbar nicht die bfOffBits im TBitmapFileHeader. Denn zwischen dem TBitmapInfoHeader und den Farbdaten liegen bei deinem Bitmap noch 2 leere Bytes. Diese 2 Byte liest Delphi als Farbdaten ein, wodurch der fehler entsteht.
Du hast jetzt mehrere möglichkeiten: Du schreibst dir eine eigene Prozedur zum einlesen des Bitmaps oder du änderst die Bitmaps indem du die 2 leeren Bytes entfernst bevor sie in Delphi eingelesen werden. Die 2te möglichkeit (das entfernen der leeren Bytes) habe ich mal übernommen, hier der Code:
Delphi-Quellcode:
procedure BitmapVerify(FileName: TFileName);
var
fs: TFileStream;
fh: TBitmapFileHeader;
ih: TBitmapInfoHeader;
Offset: DWORD;
Buffer: Pointer;
begin
fs:=TFileStream.Create(FileName, fmOpenReadWrite);
try
fs.Position:=0;
fs.ReadBuffer(fh, SizeOf(fh));
fs.ReadBuffer(ih, SizeOf(ih));
Offset:=fh.bfOffBits-(SizeOf(TBitmapFileHeader)+SizeOf(TBitmapInfoHeader));
if Offset>0 then begin
GetMem(Buffer, ih.biSizeImage);
try
fs.Position:=fh.bfOffBits;
fs.ReadBuffer(Buffer^, ih.biSizeImage);
fh.bfSize:=fh.bfSize-Offset;
fh.bfOffBits:=fh.bfOffBits-Offset;
fs.Position:=0;
fs.WriteBuffer(fh, SizeOf(fh));
fs.Position:=fh.bfOffBits;
fs.WriteBuffer(Buffer^, ih.biSizeImage);
fs.Size:=fh.bfSize;
finally
FreeMem(Buffer, ih.biSizeImage);
end;
end;
finally
fs.Free;
end;
end;
mfg