Unterformate: RGB unkomprimiert oder RLE komprimiert
Farbtiefe: 1, 4 oder 8 Bit pro Pixel jeweils mit Palette, 16 Bit HighColor, 24 oder 32 Bit TrueColor (16 und 32 Bit nur bei Windows 95 und NT)
Maximale Bildgröße: 65.536 x 65.536 Pixel
Kompression: Normale BMP-Bilder sind unkomprimiert. Das Bild wird Punkt für Punkt so abgespeichert, wie es auf dem Bildschirm zu sehen ist. Das hat den Vorteil, dass es extrem schnell geöffnet und gespeichert werden kann. Aus diesem Grund wird es intern von Windows sehr oft benutzt. Ein großer Nachteil von BMP-Bildern ist der extreme Platzbedarf. Auch relativ kleine Bilder können schnell mehrere Megabyte groß werden.
Aus diesem Grund ermöglicht das BMP-Format wahlweise eine RLE-Kompression (leider nur bei 16 oder 256 Farben). Dieser Algorithmus ist nur durch- schnittlich effektiv. Während einfache Bilder auf 40 bis 60 Prozent verkleinert werden, können sich zum Beispiel verrauschte Fotos bis auf 130 Prozent aufblähen.
Qualität: An der Qualität eines Bildes ändert das BMP-Format nichts. Die Bildinformationen werden genauso abgespeichert, wie sie auf dem Monitor dargestellt sind.
Praktische Anwendungen: Hintergrundbilder für Windows müssen unbedingt im Format BMP gespeichert sein, wobei auch das Unterformat RLE erlaubt ist. Auch für die Programmentwicklung unter Windows sind BMP-Bilder unverzichtbar. Weiterhin eignet es sich wegen seiner hohen Geschwindigkeit zum temporären Zwischenspeichern. Wenn ein fertiges Bild endgültig gespeichert wird, sollte jedoch ein platzsparenderes Bildformat gewählt werden. GIF oder PNG zum Beispiel erreichen sehr gute Packraten ohne Qualitätsverlust. Und zu guter Letzt ist das Grafikformat BMP oft der letzte Ausweg, wenn es um den Datenaustausch mit älteren Programmen geht.
Typische Software: Windows 3.x bis NT, Paintbrush, Paint, NeoPaint
Interner Aufbau: Eine BMP-Datei setzt sich aus mehreren Datenblöcken zusammen: Datei-Header, Bitmap-Info-Block, Farbpalette und schließlich die Bilddaten. Der Header ist folgendermaßen aufgebaut:
| Offset | Bytes | Bedeutung |
|---|---|---|
| 00H | 2 | Dateikennung 'BM' |
| 02H | 4 | Dateilänge in Byte |
| 06H | 4 | reserviert (muß 0 sein) |
| 0AH | 4 | Offset des Datenbereiches |
Dieser Header ist bei allen BMP-Versionen gleich. Die im folgenden beschriebenen Strukturen können jedoch je nach Windows-Version verschieden sein. Der Info-Block enthält normalerweise folgende Informationen:
| Offset | Bytes | Bedeutung |
|---|---|---|
| 0EH | 4 | Länge des Info-Blockes in Byte (28 00 00 00) |
| 12H | 4 | Breite des Bildes in Pixeln |
| 16H | 4 | Höhe des Bildes in Pixeln |
| 1AH | 2 | Farbebenen (muß 1 sein) |
| 1CH | 2 | Zahl der Bits pro Pixel |
| 1EH | 4 | Typ der Komprimierung (normalerweise 0) |
| 22H | 4 | Größe des Bitmap-Datenbereiches in Byte |
| 26H | 4 | horizontale Auflösung |
| 2AH | 4 | vertikale Auflösung |
| 2EH | 4 | Zahl der benutzten Farben (normalerweise 0) |
| 32H | 4 | Zahl der wichtigen Farben (normalerweise 0) |
Der Komprimierungstyp ist bei unkomprimierten BMP-Dateien immer 0. Die Zahlen 1 und 2 geben eine RLE-Kodierung für Bilder mit 8 bzw. 4 Bit pro Pixel an. Der Wert 3 beschreibt eine unkomprimierte Bitfeld-Kodierung bei Bildern mit 16 oder 32 Bit pro Pixel.
Farbpalette: Nach diesen Datenblock folgt, wenn benötigt, eine Farbtabelle. Darin wird jede Farbe mit 4 Bytes kodiert: Blau-, Grün- und Rotanteil sowie ein reserviertes Nullbyte. Die Länge der Palette berechnet sich also nach der Formel 'Anzahl der Farben * 4'. Die Farbanteile können Werte von 0 bis 255 annehmen, so ergeben sich über 16 Millionen mögliche Kombinationen. Einige Besonderheiten sind zu beachten:
Auch Bitmaps mit nur einem Bit Farbtiefe (monochrom) besitzen eine Farbpalette. Zur Darstellung des Bildes werden die ersten beiden Farben benutzt. Normalerweise sind das Schwarz und Weiß, aber auch alle anderen der 16 Millionen Farben sind denkbar! Mir ist zur Zeit kein Grafikprogramm bekannt, das diese Möglichkeit nutzt. Es ist jedoch sehr einfach machbar, z.B. mit einem Hex-Editor bei Offset 36H die voreingestellten Werte zu verändern.
Bei TrueColor-Bilder kann die Farbpalette komplett entfallen. Wenn sie jedoch vorhanden ist, wird zusätzlich bei Offset 2EH die Größe der Palette gespeichert.
Datenbereich: Bei unkomprimierten BMP-Dateien werden die Bitmapdaten ganz einfach zeilenweise abgespeichert. Allerdings - und das ist eine Besonderheit - wird dabei mit der untersten Zeile begonnen. Das Bild steht praktisch auf dem Kopf und muß jedesmal umgedreht werden. Wichtig ist ebenfalls, dass jede Bildzeile bei einer 32-Bit-Grenze enden muß. Überschüssige Bits am rechten Bildrand werden gegebenenfalls mit Null aufgefüllt. (gilt auch für komprimierte Bitmaps)
Bilder mit 4 oder 8 Bit pro Pixel können alternativ mit einem RLE-Algorithmus komprimiert werden. Auch dabei werden die Bildzeilen nacheinander kopfstehend bearbeitet. Die Komprimierung selbst ist recht einfach zu entschlüsseln. Folgen gleicher Bits werden in 2 Bytes kodiert. Dabei gibt das erste Byte an, wie oft das zweite Byte wiederholt werden soll. So wird zum Beispiel aus der Sequenz '03 B4' die Folge 'B4 B4 B4'.
Ist das erste Byte einer Sequenz dagegen mit 00H belegt, liegen unkomprimierte Bildpunkte vor. Es folgen darauf ein Zähler (Zahl von 3 bis 255) sowie die entsprechende Menge unkomprimierter Bytes. Wenn der zweite Wert mit der Zahl 0, 1 oder 2 belegt ist, sind die Daten wiederum anders zu interpretieren. Die Sequenz '00 00' beschreibt das Ende einer Zeile, mit '00 01' wird das Ende der Bitmap markiert. Die Sequenz '00 02 xx yy' wird als Delta-Record bezeichnet. Die Zahlen x und y definieren einen relativen Offset in Bildpunkten ab der aktuellen Position, an der der nächste Bildpunkt auszugeben ist. Somit ergeben sich zusammenfassend die folgenden Sequenzen:
| 00 00 | Ende einer Zeile |
| 00 01 | Ende des Bildes |
| 00 02 xx yy | Delta-Record (Verschiebung zu einem relativen Offset) |
| 00 nn dd dd .. | Eine bestimmte Anzahl n unkomprimierte Bilddaten d |
| nn dd | Eine bestimmte Anzahl n komprimierte Bilddaten d |