BMP-Header auslesen - klappt nicht.
-
moin
main.cpp:
#include <fstream> #include <iostream> #include <string> #include "BMPType.h" using namespace std; class BMP { public: BMP(string); BITMAPFILEHEADER bmfh; }; BMP::BMP(string FileName) { ifstream ifFile; ifFile.open(FileName.c_str(), ios::binary); ifFile.read((char*)&bmfh,sizeof(BITMAPFILEHEADER)); ifFile.close(); } int main(int argc, char *argv[]) { BMP BMPFile("weiss.bmp"); cout << BMPFile.bmfh.bfType << endl << BMPFile.bmfh.bfSize << endl << BMPFile.bmfh.bfOffBits << endl; return 0; }
BMPType.h:
typedef struct { // bmfh char bfType[2]; unsigned long bfSize; unsigned short bfReserved1; unsigned short bfReserved2; unsigned long bfOffBits; } BITMAPFILEHEADER; typedef struct { // bmih unsigned long biSize; long biWidth; long biHeight; unsigned short biPlanes; unsigned short biBitCount; unsigned long biCompression; unsigned long biSizeImage; long biXPelsPerMeter; long biYPelsPerMeter; unsigned long biClrUsed; unsigned long biClrImportant; } BITMAPINFOHEADER;
wenn ich das dann kompiliere wird folgendes ausgegeben:
BMv?
0
2621440was nicht sein kann, weil der file keine 0kb gross ist und es eigentlich BM und nicht BMv? heissen müsste. was also tun?
-
Das Problem was du haben wirst, ist folgendes.
Dem Compiler steht es frei wie er mit dem Alignment der Daten eines Structs umgeht.Er kann also für ein short (16 Bit) trotzdem 32 Bit belegen und daher verutscht dein Struct beim Einlesen.
Lösungsmöglichkeiten:
1. Du liest jeden Wert einzeln in das Struct ein.
2. Du verwendest folgende syntax, funktioniert aber nicht auf jedem Compiler.
#pragma pack(1) typedef struct { ... } name; #pragma pack(0)
Dadurch sollte das Alignment korrekt sein.
-
thx tobian.
scheint zu funtionieren. ich bekomme nun zwar eine warnung vom compiler (pack(0) mag er nicht) aber der header wird richtig ausgelesen.
/edit: hab gerade gelesen, das pack standardmässig 8 is. mit pack(8) leufts.
-
das soll sicher #pragma pack() stack #pragma pack(0) sein...