Tja, ein klarer Designfehler von XbpBitmap() in Bezug auf BMP Dateien.
Ob Xbase++ intern die 14 Byte Header nutzt oder nicht spielt keine Rolle, diese Methode hätte schon immer den Inhalt einer normalen BMP Datei zurückgeben und auch übernehmen müssen.
Aber wer ist schon frei von Fehlern
Aber der Code, welcher als "Workaround" aufgeführt ist, finde ich etwas umständlich.
Für HBPrintPDF() habe ich eine Methode die den Header erzeugt erstellt:
Code: Alles auswählen
// Rückgabewert von XbpBitmap() im BMP Format ohne Header wird per cBMP übergeben.
METHOD HBPrintPDF:AddImageFromXbpBMP(cBMP) // NUR BEI BMP für Rückgabewert von XbpBitmap():setBuffer() !!! *.BMP !!!
if left(cBMP,2) # "BM" // sicher ist sicher, wenn der String (Bytearray) mit "BM" beginnt, dann ist der Header schon davor !
cBMP := "BM"+U2BIN(len(cBMP)+14)+W2BIN(0)+W2BIN(0)+U2BIN(BIN2U(left(cBMP,4))+14)+cBMP
endif
return ::AddImageFromString(cBMP,0) // !!! *.BMP !!!
// BMP mit Header für Übergabe an XbpBitmap():setBuffer() vorbereiten ...
eine allgemeingültige einfache Funktion wäre das:
Code: Alles auswählen
// Rückgabewert von XbpBitmap() im BMP Format ohne Header wird per cBMP übergeben.
function BMPaddHeader(cBMP)
if left(cBMP,2) # "BM" // sicher ist sicher, wenn der String (Bytearray) mit "BM" beginnt, dann ist der Header schon davor !
cBMP := "BM"+U2BIN(len(cBMP)+14)+W2BIN(0)+W2BIN(0)+U2BIN(BIN2U(left(cBMP,4))+14)+cBMP
endif
return cBMP
Aus einer Datei den Header abzuschneiden ist noch einfacher, da er immer 14 Byte lang ist
Code: Alles auswählen
// Rückgabewert von XbpBitmap() im BMP Format ohne Header wird per cBMP übergeben.
function BMPnoHeader(cBMP)
if left(cBMP,2) # "BM" // sicher ist sicher, wenn der String (Bytearray) mit "BM" beginnt, dann ist der Header schon davor !
cBMP := substr(cBMP,15)
endif
return cBMP