bitmap lesen
-
hi ich habe ein bitmap file und würde das gerne in mein programm einlesen und am ende ne matritze mit den farbwerten(grauwerte) haben. kann mir jemand sagen wie ich sowas mache.
-
Wenn du das Windows Bitmap-Format meinst, dann schau es dir mal unter http://de.wikipedia.org/wiki/Windows_Bitmap an.
Es wäre jedoch wahrscheinlich einfacher, wenn du dafür eine Grafikbibliothek verwendest (entsprechend deinem Compiler).
-
Hi!
Das ist in C geschrieben, kannst es dir ja nach C++ umcoden.
#include <windows.h> void quick_hack(char* bmpfile) { BITMAPINFOHEADER bmih; BITMAPFILEHEADER bfh; int fs = 20; FILE* fp = fopen(bmpfile,"rb"); if(!fp) { perror(bmpfile); return; } fread(&bfh, sizeof(char), sizeof(bfh), fp ); if ( ferror(fp) ) { perror(bmpfile); return; } fread(&bmih, sizeof(char), sizeof(bmih), fp ); if ( ferror(fp) ) { perror(bmpfile); return; } printf("File: %s\n\n", bmpfile ); // Das ist der Offset vom Dateibeginn zum ersten Pixel der Bitmap. printf ( "%-*s %-lu\n", fs, "Offset:", bfh.bfOffBits ); printf( "%-*s %-ld\n", fs, "Width:", bmih.biWidth ); printf( "%-*s %-ld\n", fs, "Height:", bmih.biHeight ); printf( "%-*s %-hu\n", fs, "Bit count:", bmih.biBitCount ); // Diesen Speicherplatz musst du reservieren, // um alle Pixel komplett einlesen zu können. printf( "%-*s %-lu\n", fs, "Size image:", bmih.biSizeImage ); fclose(fp); }
Gruß, p.
-
vielen dank sagemal du reservierst nur den speicherplatz und liest den header ein was ist mit dem body(also die pixel selber oder bin ich zu dumm um das zu sehen?
-
Vielleicht hilft dir das hier weiter: http://www.wotsit.org/list.asp?fc=1
Andernfalls, kannst du das auch mit der SDL (http://www.libsdl.org) machen. Je nachdem, was du vor hast.
Es gibt auch eine Biliothek, die nur Bilder lädt und speichert. Nennt sich DevIL (http://openil.sourceforge.net/) vielleicht ist das was für dich.
-
KOR schrieb:
vielen dank sagemal du reservierst nur den speicherplatz und liest den header ein was ist mit dem body(also die pixel selber oder bin ich zu dumm um das zu sehen?
Anhand des Headers kannst du den Rest einlesen.
-
KOR schrieb:
... was ist mit dem body(also die pixel selber ...
Das habe ich mit den Kommentaren zu erklären versucht. ( Zeile 31,37,38 )
Dieser Wert sagt dir, wohin du deinen Filepointer setzen musst, um auf den ersten Pixel zu seigen:
bfh.bfOffBits
In C würest du also in etwa so etwas hier schreiben:
fseek ( fp, bfh.bfOffBits, 0 );
Damit hast du den Dateizeiger genau auf den Beginn der Pixeldaten gesetzt.
Jetzt kannst du anfangen einzulesen.
Um zu wissen, wie viele Bytes alle deine Pixel haben, fragst du die Variablebmih.biSizeImage
wie viele Byte sie zu bieten hat. Dem enstprechend musst du vorher Speicherplatz zur Verfügung stellen.
Manche Libs lassen diesen Wert 0, sodass du die Größe selbst berechnen musst.
Das könntest du mitbmih.biSizeImage = bmih.biWidth * bmih.biBitCount) + 31) & ~31) >> 3) * bmih.biHeight;
tun. Das sorgt gleichzeitig dafür, das deine Zeilen(in Byte) ein Vielfaches von 4 sind, so wie es Mircosoft gern hätte. Beim Speichern musst du ebenfalls darauf achten, das sich die Zeilen durch 4 teilen lassen, sonst zeigen die Grafikprogramme deine Bilder zerpuzzelt an, auch wenn der Inhalt stimmt.