You are not logged in.

  • Login

1

Thursday, January 18th 2007, 6:35pm

Schwierigkeiten mit Bitmapinfoheader

Guten abend,

zunächst versuche ich lediglich Daten über ein Bild zu ermitteln.

Ich beschaffe mir zunächst den BITMAPFILEHEADER (Fileheader) sowie den BITMAPINFOHEADER (Infoheader) und übergebe diese dann an eine Funktion, die ein paar Informationen zu der Datei ausgeben soll.

Mit dem Fileheader ist alles in ordnung. Allerdings bekomme ich falsche Werte, wenn ich auf den Infoheader zugreife.

Den Infoheader beschaffe ich mir über folgende Funktion:

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
BITMAPINFOHEADER getInfoheader(char *file)
{
	FILE *fileHandler = fopen(file, "rb");
	if(fileHandler)
	{
		BITMAPINFOHEADER bmih;
		fread((char *)&bmih, sizeof(BITMAPINFOHEADER), 1, fileHandler);
		fclose(fileHandler);
 
		return bmih;
	}
	else
	{
		printf("Fehler, Datei nicht gefunden!\n");	
		exit(1);
	}
}



Anschließend versuche ich Informationen auszulesen:

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
void getHeaderInfo(BITMAPFILEHEADER *bmfh, 
					   BITMAPINFOHEADER *mbih)
{
	printf("\nASCII: %d\nReserved: %d\nFilesize: %d kb\nOffset: %d\n",
		bmfh->bfType,			// Muss den dezimalen Wert 19778 haben
		bmfh->bfReserved1,		// Wert 0
		((bmfh->bfSize-bmfh->bfOffBits)/1024),	
        bmfh->bfOffBits);		
 
	printf("Size of Infoblock: %d\nPixel: %d x %d\n",
		mbih->biSize,
		mbih->biWidth, mbih->biHeight);
}


Das Problem liegt nun an dem Infoheader. Ich erhalte falsche Werte. So z.B. eine Breite von 2 Pixeln und eine Höhe von mehreren Millionen Pixeln (Wobei das Bild ~250x300 Pixel groß ist).

Ich habe bereits mehrere BMP Dateien mit Paint erstellt und auch welche aus dem Internet probiert, aber es ergaben sich jedesmal derartig falsche Werte.

2

Friday, January 19th 2007, 11:58am

Es gibt in Summe glaube ich 5-6 verschiedene Subspezifikationen des Bitmap-Headers.
Schau mal auf http://www.wotsit.org/ nach dem Format von BMPs - da gibt es einige und du musst raus finden, welche dein Paint speichert.

3

Friday, January 19th 2007, 6:22pm

Das problem hat sich erledigt *g*

Da ich den Filehandler neu initiiere, fängt der auch wieder am Anfgan der Datei an zu lesen. Da aber die ersten 14 Bytes der Fileheader ist und die folgenden 40 Bytes der Infoheader ist, muss ich mit fseek() erst die 14 Bytes überspringen.

Social bookmarks