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
    2621440

    was 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.


  • Mod

    das soll sicher #pragma pack() stack #pragma pack(0) sein...


Anmelden zum Antworten