BMP größe auslesen.
-
Hallo,
wie kann man die Datenmenge ohne Header einer bmp-Datei genau auslesen?
Bei wiki steht, dass diese Daten ab der 22 bis 25 hex-Position stehen. Als Besipiel steht es auch dort:
F0 03 00 00 entspricht hex. 03 F0, das heißt insgesamt 1008 Bytes
Erstens ist es für mich nicht so ganz klar, warum es 03 F0 anstatt von F0 03 genommen wurde?
Zweitens wie komme ich auf eine 1008 Zahl beim Byte-für-Byte Datenauslesen?
Danke.
-
-
-
Im Header steht ein Offset (BITMAPFILEHEADER.bfOffBits), der den Beginn der Pixeldaten angibt. Daraus ist der absolute Offset zu berechnen und von der Gesamtgröße abzuziehen. Die Hex-Zahlen sind in Little Endian Schreibweise dargestellt: F0 (bits 0-7) 03 (bits 8-15). Die Darstellung als 16bit wert 03F0 wäre eine Art Big Endian Darstellung.
-
hi
kann man da nicht auch fsetpos benutzen, denn die grösser der datei ändert ja immer und fseek heisst ja 'file suche' oder täusch ich mich?
danke
-
Naja, wenn du dich unbedingt mit der Umrechnung von Byte-Positionen in fpos_t-Werte rumärgern willst, wünsche ich dir viel Spaß dabei (der exakte Inhalt von fpos_t ist afaik nicht im Standard definiert).
fseek() ist da schon besser geeignet, da du die nötige Position direkt als Offset angeben kannst (und diesen Wert hast du vorliegen).
-
CStoll schrieb:
fseek() ist da schon besser geeignet, da du die nötige Position direkt als Offset angeben kannst (und diesen Wert hast du vorliegen).
Angennomen finde ich mit fseek die Stelle, wo die Daten beginnen, dann subtrahiere ich von der Gesamtgröße der Datei die 54 Byte (Header) und habe damit meine raw-Daten?
-
Häh? Wie meinst du?
fseek() findet keine Werte, sondern stellt den Lese/Schreibzeiger des Files auf eine bestimmte Position. Diese Zielposition mußt du vorher aus dem Bitmap-Header raussuchen:
BITMAPFILEHEADER hdr; fread(bitmap,&hdr,sizeof(hdr));//Header auslesen //hier könntest du eventuell noch den BITMAPINFOHEADER auslesen //(Bildgröße, Farbtabelle etc) fseek(bitmap,hdr.bfOffBits,SEEK_SET) //jetzt steht dein File an der richtigen Stelle, um die Bilddaten auslesen zu können
-
CStoll schrieb:
BITMAPFILEHEADER hdr;
CStoll schrieb:
fseek(bitmap,hdr.bfOffBits,SEEK_SET)
hdr.bfOffBits
Irgendwie ist es mir nicht so ganz klar...
-
Diese BITMAP...-Strukturen sind (afaik) in der WinAPI definiert und entsprechen dem Aufbau des BMP-Headers (siehe z.B. in der Wikipedia).
Der fread()-Befehl hat nun den ersten Block des Headers (der FILEHEADER) eingelesen und in die Variable hdr geschrieben. Zu diesem Block gehört auch die Angabe, wo die eigentlichen Bilddaten anfangen (in der Membervariable bfOffBits).
-
CStoll schrieb:
Diese BITMAP...-Strukturen sind (afaik) in der WinAPI
und wenn man unter unix ist?
-
Dann kannst du sie dir entweder selber definieren (irgendwo in der MSDN müsste die genaue Definition stehen) oder dich anhand der Offset-Werte durch deine Datei durchhangeln:
int bfOffBits; fseek(bitmap,10,SEEK_SET);//ab Byte 10 steht der Startpunkt der Bilddaten fread(bitmap,&bfOffBits,4); fssek(bitmap,bfOffBits,SEEK_SET);
-
CStoll schrieb:
int bfOffBits; fread(bitmap,&bfOffBits,4);
Entschuldigung, ich bin mir nicht ganz sicher, aber fehlt vielleicht was bei fread?
-
Sorry, daß ich nicht vorher nach der "richtigen" Syntax gesucht hatte - so viel Eigeneinitiative hatte ich dir schon zugetraut
-
CStoll schrieb:
so viel Eigeneinitiative hatte ich dir schon zugetraut
Ok, danke dir für die online-Hilfe
Richtige Variante für weitere Dummys, wie ich:
fread(&bfOffBits, sizeof(int), 1, bitmap);