Thema: Delphi Bitmap: falsche Farben

Einzelnen Beitrag anzeigen

Phantom1

Registriert seit: 20. Jun 2003
279 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Bitmap: falsche Farben

  Alt 21. Nov 2006, 22:21
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
  Mit Zitat antworten Zitat