Bitmap File header



  • Hallo allerseits,

    ich versuche einen BMP datei mit c zu erstellen, leider erfolgt immer ein fehler wenn ich dann versuche die erstellt datei zu öfnen.
    Ich vermtue ich hab im header was falsch gemacht, leider finde ich den fehler nicht.

    /
    
    struct bmp_header{
    	//Dateikopf	
    	short BM; //Dateityp 19778='BM'
    	int Size; //Größe der Datei in byte
    	unsigned int Reserved; //=0
    	int OffBits; //Offset der bilddateien von begin der datei an
    
    	//Bild Eigenschaften
    	int Size2; //Größe der "Bildeigenscahften" (40 byte)
    	int Width; //Breite des Bildes in Pixel
    	int Height; //Höhe des Bildes in Pixel (+ => unten nach oben, - => oben nach unten)
    	short Planes; //=1 (anzahl der Farbebenen in BMP immer 1)
    	short BitCount; //Farbtiefe (24 empfohlen 8 byte pro farbe) 
    	int Compression; //Kompremierung (=0)
    	int SizeImmage; //0 oder größe der Bilddateien in Byte
    	int XPelsPerMeter; //Horrizontale auflösung (pixel/meter) kann auf 0 gesetzt werden
    	int YPelsPerMeter; //Vertikale auflösung (pixel/meter) kann auf 0 gesetzt werden
    	int ClrUsed; //Anzahl der einträge in Farbtabelle (0°=2^BitCount) bzw. 0=max.-Anzahl
    	int ClrImportant; //Anzahl der der im Bild verwendeten farben (=0 <=alle)
    };
    
    struct pixel{
    	char B; //Blau
    	char G; //Grün
    	char R; //Rot
    };
    
    struct bmp_header createbmpheader(int height, int width){
    	struct bmp_header header;
    
    	//Dateikopf	
    	header.BM=19778;
    	header.Size=54+3*height*width;
    	header.Reserved=0;
    	header.OffBits=54;
    
    	//Bild Eigenschaften
    	header.Size2=40;
    	header.Width=width;
    	header.Height=height;
    	header.Planes=1;
    	header.BitCount=24; 
    	header.Compression=0;
    	header.SizeImmage=0;
    	header.XPelsPerMeter=0;
    	header.YPelsPerMeter=0;
    	header.ClrUsed=0;
    	header.ClrImportant=0;
    
    	return header;
    }
    

    Ich währe fuer jede Hilfe Dankbar hinter den header schreibe ich dann feur jedes Pixel ein "struct pixel", meien auflösung ist 1024x768, also durch 4 teilbar (da stand was bei wiki mit leer bytes, das wolt eich erstmal umgehen)

    danke schonmal im Vorraus



  • Da du nicht verrätst, wie du die Datei erzeugst, muss ich annehmen, dass du einfach das Objekt als char -Array interpretierst und in die Datei schreibst. Das funktioniert deswegen nicht, weil die Struktur im Speicher keine unterbrechungsfreie Abfolge ihrer Member sein muss. Der Compiler darf dazwischen auffüllen, damit die Member günstigere Adressen bekommen.
    Denk dir etwas Vernünftiges für die Serialisierung aus. Für den Anfang zum Beispiel, die Werte einzeln zu schreiben.



  • ich erzeuge die datei folgender maßen:

    int create_bmp(struct pixel* Bild, int width, int height, char* dateiname){
    	FILE* datei=NULL;
    	struct bmp_header header=createbmpheader(height,width);
    	datei=fopen(dateiname,"wb");
    	if(datei==NULL) return -1;
    	fwrite(&header,54,1,datei);
    	fwrite(Bild,sizeof(struct pixel),width*height ,datei);
    	return 0;
    }
    

    Aber stimmt das mit dem auffüllen könnte sein, da habe ich nciht drüber anchgedacht, da ich das selbe zuletzt mit einem wave-header gemacht habe und es lief problemlos.

    Ich werde es mal ausprobieren mit dem einzeln schreiben und mich dann zurück melden.

    thx



  • Einzeln rein schreiben hilft, vielen dank
    da hätt eich mri die mühe mit dem struct ja sparen können ^^.
    weist du zufällig auch noch warum das bild imemrnoch grau ist auch wenn ich alle 3 farben auf 127 setze?

    mfg c-dur



  • die frage war dumm, habs mri gerade selber beantwortet ^^
    (unsigned char 😉 )



  • Hallo,

    mit einer Struktur geht es auch, du mußt nur entsprechende Compiler-Optionen setzen. Such mal nach "#pragma pack" (z.B. im C++ Forum)...


Anmelden zum Antworten