Wikipedia · einfach zusammengefasst · Stand
Windows Bitmap
Windows-Bitmaps werden entweder unkomprimiert oder verlustfrei mit RLE-Komprimierung (Lauflängenkodierung) gespeichert. Dies ist ein eher schwaches …
Inhalt6 Abschnitte
Grundidee und Merkmale
Windows Bitmap (BMP), auch device-independent bitmap (DIB), ist ein zweidimensionales Rastergrafikformat für Windows und OS/2. Microsoft führte es mit Windows 3.0 ein, das 1990 erschien. Übliche Dateiendungen sind .bmp und seltener .dib; typische MIME-Typen sind image/x-ms-bmp, image/x-bmp und image/bmp. Die magische Zahl am Dateianfang ist 42, 4D hex beziehungsweise „BM“.
BMP-Version 3 unterstützt Farbtiefen von 1, 4, 8, 16, 24 oder 32 bpp (bits per pixel, Bits je Bildpunkt). Bei 1, 4 und 8 bpp werden die Farben über eine Farbtabelle indiziert. Bei 16 und 32 bpp müssen nicht alle Bits genutzt werden. Alphakanäle, Farbkorrektur und Metadaten gehören nicht zum Unterstützungsumfang von Version 3.
Die Bilddaten werden entweder unkomprimiert oder verlustfrei mit RLE (Lauflängenkodierung) gespeichert. RLE ist jedoch vergleichsweise schwach, weshalb BMP-Dateien meist deutlich größer als PNG-Dateien sind und im Internet kaum verwendet werden. Das Format ist dafür einfach aufgebaut, im Windows-Umfeld weit verbreitet und wird von gängiger Grafiksoftware unterstützt; die Farbtiefen 16 und 32 bpp sind dabei eher exotisch.
Theoretisch können Breite und Höhe jeweils bis zu 2.147.483.647 Pixel betragen (2^31 − 1). Viele Decoder akzeptieren in der Praxis jedoch deutlich niedrigere Werte.
Aufbau und technische Grundlagen
Eine BMP-Datei der Version 3 besteht grundsätzlich aus drei Teilen: dem Dateikopf (BITMAPFILEHEADER), dem Informationsblock (BITMAPINFO) und den Bilddaten. Je nach Datei können außerdem Farbmasken, eine Farbtabelle und ungenutzter Platz enthalten sein.
BMP verwendet die Little-Endian-Konvention. WORD bezeichnet einen 16-Bit-vorzeichenlosen Integer, DWORD einen 32-Bit-vorzeichenlosen Integer und LONG einen im Zweierkomplement kodierten 32-Bit-Integer.
Die Bilddaten beginnen an der im Dateikopf gespeicherten Position bfOffBits. Dieser Offset ist nicht zwangsläufig 54 Byte. Der Wert 54 ergibt sich nur aus 14 Byte Dateikopf plus 40 Byte Informationsblock; deshalb muss der tatsächliche Offset dynamisch ausgelesen werden, da sonst Fehldarstellungen entstehen können.
Dateikopf
Der BITMAPFILEHEADER ist 14 Byte groß und enthält die wichtigsten Angaben zum Auffinden der Bilddaten:
- bfType steht bei Offset 0 und umfasst 2 Byte. Es enthält die ASCII-Zeichenkette „BM“ (Hex: 0x42 0x4D, dezimal: 66 77).
- bfSize steht bei Offset 2 und umfasst 4 Byte. Es gibt die Größe der BMP-Datei in Byte an, ist aber unzuverlässig.
- bfReserved steht bei Offset 6 und umfasst 4 Byte. Das Feld ist reserviert, von der Software abhängig und standardmäßig 0.
- bfOffBits steht bei Offset 10 beziehungsweise 0x0A und umfasst 4 Byte. Es bezeichnet den Offset der Bilddaten in Byte vom Dateibeginn an.
Informationsblock und Farbcodierung
Der Informationsblock beginnt mit dem 40 Byte großen BITMAPINFOHEADER. Wichtige Felder sind:
- biSize gibt die Größe der BITMAPINFOHEADER-Struktur in Byte an.
- biWidth enthält die Breite in Pixeln.
- biHeight enthält den Betrag der Höhe in Pixeln. Ist der Wert positiv, handelt es sich um eine bottom-up-Bitmap: Die Bilddaten beginnen mit der untersten und enden mit der obersten Zeile. Ist er negativ, handelt es sich um eine top-down-Bitmap mit umgekehrter Reihenfolge.
- biPlanes muss 1 sein. Die Bedeutung als Anzahl von Farbebenen aus älteren Formaten wie PCX wird bei BMP nicht verwendet.
- biBitCount gibt die Farbtiefe an und muss 1, 4, 8, 16, 24 oder 32 betragen.
- biCompression bestimmt die Speicherung: 0 (BI_RGB) bedeutet unkomprimiert, 1 (BI_RLE8) RLE für 8 bpp, 2 (BI_RLE4) RLE für 4 bpp und 3 (BI_BITFIELDS) unkomprimierte, durch Farbmasken definierte Daten. BI_RLE8 ist nur bei biBitCount=8 und positiver Höhe erlaubt; BI_RLE4 nur bei biBitCount=4 und positiver Höhe; BI_BITFIELDS nur bei 16 oder 32 bpp.
- biSizeImage ist bei BI_RGB entweder 0 oder die Größe der Bilddaten in Byte, bei anderen Kompressionsarten die tatsächliche Größe.
- biXPelsPerMeter und biYPelsPerMeter geben die horizontale und vertikale Auflösung in Pixeln pro Meter an, werden bei BMP aber meistens auf 0 gesetzt.
- biClrUsed gibt die Anzahl der Farbtabelleneinträge an. Bei 1 bpp ist der Wert 0; bei 4 oder 8 bpp bedeutet 0 die maximale Anzahl von 16 beziehungsweise 256 Einträgen. Bei anderen Farbtiefen bezeichnet der Wert die vorhandenen Einträge, wobei 0 keine Farbtabelle bedeutet.
- biClrImportant gibt bei 1, 4 oder 8 bpp die Anzahl der im Bild verwendeten Farben an; 0 bedeutet alle Farben der Farbtabelle. Bei anderen Farbtiefen ist es die Anzahl, wenn eine vorhandene Farbtabelle alle verwendeten Farben enthält, sonst 0.
Bei BI_BITFIELDS folgen drei DWORDs als Masken für Rot, Grün und Blau. Gesetzte Bits müssen jeweils direkt aufeinanderfolgen, dürfen sich nicht überlappen und müssen bei 16 bpp in den beiden niederwertigen Bytes liegen.
Eine Farbtabelle wird bei 1, 4 oder 8 bpp und biClrUsed=0 mit 2^biBitCount Einträgen angelegt; bei anderen Farbtiefen folgt dann keine Farbtabelle. Ist biClrUsed ungleich 0, enthält sie genau biClrUsed Einträge. Jeder Eintrag ist 4 Byte groß und enthält in dieser Reihenfolge je ein Byte für Blau, Grün und Rot sowie ein auf 0 gesetztes Byte.
Bilddaten und Kompression
Die ungefähre Größe unkomprimierter Bilddaten beträgt bei durch 4 teilbaren Bildbreiten biWidth×biHeight×biBitCount/8; bei komprimierten Daten gilt biSizeImage. Die Bilddaten werden zeilenweise gespeichert. Bei positiver biHeight steht die unterste Zeile zuerst, bei negativer biHeight die oberste. Bei BI_RGB und BI_BITFIELDS wird jede Zeile rechts mit Nullbytes auf ein Vielfaches von 4 Byte aufgefüllt.
Bei BI_RGB bestehen die Pixel je nach Farbtiefe aus folgenden Daten:
- 1, 4 oder 8 bpp: ein 0-basierter Index auf einen Eintrag der Farbtabelle.
- 16 bpp: Rot-, Grün- und Blaukanal verwenden die Masken 0x00007C00, 0x000003E0 und 0x0000001F. Jeder Kanal ist 5 Bit groß; dadurch sind 32.768 Farben möglich, ein Bit bleibt ungenutzt.
- 24 bpp: je ein Byte für Blau, Grün und Rot, in dieser Reihenfolge.
- 32 bpp: Rot, Grün und Blau verwenden die Masken 0x00FF0000, 0x0000FF00 und 0x000000FF. Jeder Kanal ist 8 Bit groß; insgesamt sind 16.777.216 Farben möglich, 8 Bit bleiben ungenutzt. Programme wie Adobe Photoshop interpretieren die verbleibenden 8 Bits (0xFF000000) teilweise als Alphakanal mit 256 Transparenzstufen; die BMP-Spezifikation sieht dies jedoch nicht vor.
Bei BI_RLE8 und BI_RLE4 bilden jeweils zwei aufeinanderfolgende Bytes einen Datensatz. Ist das erste Byte ungleich 0, wird der Wert des zweiten Bytes so oft wiederholt, wie das erste Byte angibt. Bei BI_RLE4 werden dabei die nächsten zwei Nibbles insgesamt wiederholt, etwa 05 67 als 6 7 6 7 6. Ist das erste Byte 0, bestimmt das zweite Byte die Steuerung: 0 beendet die Bildzeile, 1 beendet die Bitmap, 2 verschiebt die aktuelle Pixelposition nach rechts und unten, und die Werte 3 bis 255 übernehmen die folgenden n Bytes beziehungsweise bei BI_RLE4 n Nibbles direkt. Der nächste Datensatz liegt anschließend am nächsten geraden Offset, vom Beginn der Bilddaten aus gezählt. Das Ergebnis wird wie unkomprimierte Bilddaten interpretiert.
Vor- und Nachteile sowie spätere Versionen
BMP bietet einen einfachen Zugriff auf Bilddaten, weil Pixel rasterartig angeordnet sind. Es lässt sich leicht aus bereits im Arbeitsspeicher vorhandenen Pixeldaten erzeugen, auf rasterbasierte Ausgabegeräte wie Monitore und Drucker ausgeben und durch Änderung einer vorhandenen Palette farblich verändern, ohne die Bilddaten selbst zu ändern.
Nachteile sind vor allem die große Dateigröße gegenüber komprimierten Formaten und die bei der üblichen Zeilenanordnung umgekehrte Darstellung im Vergleich zur Zeilenfolge eines gewöhnlichen Bildschirms.
BMP-Dateien gibt es in drei Versionen. Frühere Versionen als Version 3 existieren nicht; Version 3 ist am häufigsten. Microsoft führte mit Windows 95 und Windows 98 die Versionen 4 und 5 ein. Sie ermöglichen Alphakanäle und Farbkorrektur und können als Containerformat für PNG- und JFIF-Dateien dienen. Als eigenständige Dateien sind sie jedoch höchst selten, werden von Anwendungen kaum unterstützt und werden eher intern von Windows-Programmen verwendet.