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