C Bitmap problem

DavidB3

Mitglied
Hi ich versuche seit Stunden ein Bitmap zu machen. Dazu versuche ich die ganze zeit den Aufbau zu verstehen, aber leider hilft mir das nicht weiter.
Code:
#include <stdio.h>

typedef unsigned short int WORD;
typedef unsigned long int  DWORD;

struct BITMAPFILEHEADER
{
	WORD bfType;
	DWORD bfsize;
	WORD bfReserved1;
	WORD bfReserved2;
	DWORD bfOffBits;
}bmpf;

struct BITMAPINFOHEADER
{
	DWORD biSize;
	DWORD biWidth;
	DWORD biHeight;
	WORD biPlanes;
	WORD biBitCount;
	DWORD biCompression;
	DWORD biSizeImage;
	DWORD biXPelsPerMeter;
	DWORD biYPelsPerMeter;
	DWORD biClrUsed;
	DWORD biClrImportant;
}bmph;

FILE *f1;

void main()
{
	f1 = fopen("test.bmp", "w+b");

	bmpf.bfType = 19778;
	bmpf.bfsize = 54+(40*100);
	bmpf.bfReserved1 = 0;
	bmpf.bfReserved2 = 0;
	bmpf.bfOffBits = 54;

	bmph.biSize = 40;
	bmph.biWidth = 40;
	bmph.biHeight = 100;
	bmph.biPlanes = 0;
	bmph.biBitCount = 8;
	bmph.biCompression = 0;
	bmph.biSizeImage = 0;
	bmph.biXPelsPerMeter = 0;
	bmph.biYPelsPerMeter = 0;
	bmph.biClrUsed = 0;
	bmph.biClrImportant = 0;

	fwrite(&bmpf, sizeof(struct BITMAPFILEHEADER), 1, f1);
	fwrite(&bmph, sizeof(struct BITMAPINFOHEADER), 1, f1);

	for(int i = 0; i < (40*100); i++)
		fputc(2, f1);

	fclose(f1);
}
im code sind keine fehler, aber das bitmap, was da entsteht funktioniert nicht, ich kann es mir nicht angucken.
Wäre sher nett, wenn irgendjemand mir helfen könnte, und danke schonmal im vorraus
 
Hallo,

ich sehe da mehrere Probleme:
  1. Du hast die Farbpalette vergessen.
  2. Laut MSDN muss biPlanes auf 1 gesetzt werden.
  3. Möglicherweise ordnet dein Compiler die struct-Member um oder packt sie nicht eng aneinander (fügt Füllbytes ein). Überprüf dazu am besten die Einstellungen deines Compilers.

Grüße, Matthias
 
Ich habe entdeckt, das du den Infoheader nicht korrekt setzt. biSize bezieht sich auf die Größe des Info-Headers:

The number of bytes required by the structure.

Folglich müsstest du es so setzen:

C++:
bmph.biSize = sizeof(bmph);
 
und wie baue ich eine farbpalette ein?
Die Farbpalette muss direkt nach der BITMAPINFOHEADER-Struktur in der Datei stehen und besteht aus RGBQUAD-Werten. Bei den von dir gewählten Einstellungen (8 Bit Farbtiefe, biClrUsed = 0) wären das 256 Stück. Darauf folgen dann die Bilddaten. Für weitere Informationen verweise ich auf die MSDN-Bibliothek.

Ich habe entdeckt, das du den Infoheader nicht korrekt setzt. biSize bezieht sich auf die Größe des Info-Headers:

The number of bytes required by the structure.

Folglich müsstest du es so setzen:

C++:
bmph.biSize = sizeof(bmph);
sizeof(bmph) == 40 ;-)

Grüße, Matthias
 
Shalom!

Ich habe ein kleines Problem, dass denke ich gut in diesen Thread passt. Ich möchte mit C eine bmp-Datei in ein m*n*3 Feld einlesen. Ich möchte also die einzelnen Zeilen und Spalten, sowie die RGB-Farbwerte jedes einzelnen Pixels in diesem Array speichern. Leider habe ich bisher keine ausführliche Beschreibung des Bitmap-Formats gefunden. Kennt jemand von euch eine solche Beschreibung oder kann mir sagen, wie ich eine Bilddatei (egal welchen Typs) auslesen kann? Besonders interessant wäre natürlich auch das Auslesen von *.jpg oder *.png Files, jedoch bin ich der Meinung, dass es für den Anfang deutlich leichter ist sich an Bitmaps zu versuchen.

MfG, Andy

Edit: Habe gerade den verweis auf msdn entdeckt. Hatte ich wohl überlesen. Entschuldigt. trotzdem würde es mich interssieren, wie man im Allgemeinen Bilddateien mit C auslesen kann. Dabi ist sicher auch interessant, wie ich Hexcode in ein RGB-Array umwandel und umgekehrt. Habe also auch weiterhin Interesse an eurer Hilfestellung. Danke schonmal im Voraus.
 
Zuletzt bearbeitet von einem Moderator:
Hi,

ich vermute mal, du meinst mit m*n*3 die Werte für x, y und RGB?

Dann hast du in diesem Thread alle Informationen, die benötigt werden:

Im InfoHeader:
C++:
DWORD biWidth;
DWORD biHeight;

Alles was nach dem Info-Header kommt, sind die Werte der Pixel. Diese kannst du dann beliebig in die Struktur deiner Wahl einlesen.
 
Zurück