bmp schreiben

hannaS

Grünschnabel
Hallo,

ich habe folgendes Problem und bitte um schnelle Hilfe:
Ich möchte eine Matrix (500*500) in ein bitmap schreiben, d.h. ich möchte ein bitmap-file erstellen, welches meine Datenmatrix farbig darstellt. Ich weiss aber leider garnichts über bitmaps und bin blutiger Anfänger in Sachen Programmierung. Wo könnte ich näheres zum Thema bitmap nachlesen (in wirklich auch für Anfänger verständlichen Form)? Oder könnte mir jemand vielleicht gleich so ein paar Hinweise geben?
DANKE.
 
ganz ehrlich - such dir eine Bibliothek die das kann. Sonst musst du erst den header schreiben und danach die (evtl. Transformierten) Daten schreiben. Dazu braust du eine Dateiformatsbeschreibung.
Ein Trost - BMP kann sehr einfach sein - wenn man z.B. die Kompression weg läßt (hat das überhaupt welche?) und ohne Palette also am besten mit 24bit Farben arbeitet.
 
squeaker, wenn du wüsstest wie das geht könntest du es trotzdem bitte hier schreiben? mich interresiert das auch! wenn ich versuch was in den header zu schreiben zerstörts mir immer die ganze datei!

danke!
 
Als erstes: die Formatinformationen findet ihr hier: http://www.wotsit.org/search.asp?s=graphics

damit sieht ein einfaches BMP Bild so aus:

bitmapfileheader
bitmapinfoheader
rgbquad aka Palette
Bilddaten

Um das ganze einfach zu gestalten: 24bit Farben -> keine Palette; unkomprimiert -> einfache Bilddaten
Ich werde auch nicht darauf eingehen wie Dateien gespeichert werden - ich kann das nicht (bin eigentlich Smalltalk/Java/Perl Programmierer).

Der bitmapfileheader:

Code:
typedef struct tagBITMAPFILEHEADER {
   UINT bfType; //Typ - muss BM=19778 sein
   DWORD bfSize; //Größe der Datei in Bytes
   UINT bfReserved1; //muss 0 sein
   UINT bfReserved2; //muss 0 sein
   DWORD bfOffBits; //Start der Bitmapdaten als offset von der BITMAPFILEHEADER Struktur
} BITMAPFILEHEADER;

der bitmapinfoheader:

Code:
typedef struct tagBITMAPINFOHEADER {
   DWORD biSize; //größe der Bitmapinfo struct in bytes
   LONG biWidth; //breite des Bitmap in pixel
   LONG biHeight; //höhe des Bitmap in pixel
   WORD biPlanes; //muss 1 sein
   WORD biBitCount; //hier 24
   DWORD biCompression; //hier BI_RGB=0
   DWORD biSizeImage; //größe des Bildes in Bytes, kann wenn ohne Kompression auch 0 sein
   LONG biXPelsPerMeter; //pixel pro meter ->unwichtig
   LONG biyPelsPerMeter; //s.o.
   DWORD biClrUsed; //hier 0
   DWORD biClrImportant; //hier auch 0
} BITMAPINFOHEADER

Palette sollte nicht vorhanden sein - da 24 bit - aber das müsstet ihr noch mit nem Hex-Editor und einem 24bit Bitmap überprüfen.

Dann folgen Zeilenweise die Pixeldaten - je ein Byte pro Farbwert in der Reihenfolge Rot, Grün, Blau - insgesamt 3 Byte pro Pixel.

So, das war's auch schon. Viel Spaß damit.

P.S.: Das ganze hat mich jetzt 15 min und 1 Googleaufruf gekostet. Also merkt euch: Google ist euer Freund.
Schnappt euch eine Beschreibung des Formats, nehmt euch einen Hexeditor und öffnet ein BMP. Schreibt die Werte raus, ordnet sie den Headerstrukturen zu damit ihr das Format versteht. Dann könnt ihr das ganze auch recht einfach in eine Datei schreiben. BMP ist einfach.
 
Vielen Dank für die umfangreiche Anwort. Ich fürchte aber, dass mir das selber schreiben des headers zu kompliziert ist (bin wirklich absolute Anfängerin!) und würde doch lieber eine Bibliothek verwenden, die das alles selber macht. Habe aber bei Google auf Anhieb nichts gefunden. Kann mir jemand gleich was empfehlen oder einen Tip geben, wie und wo ich am besten suchen soll?
 
Zurück