BMP-Dateiformat - BMP file format

Windows-Bitmap
Dateinamenerweiterung
.bmp, .dib
Internet-Medientyp image/bmp
image/x-bmp
Typschlüssel 'BMP '
'BMPf'
'BMPp'
Uniform Type Identifier (UTI) com.microsoft.bmp
Entwickelt von Microsoft Corporation
Formattyp Rastergrafiken
Offenes Format ? OSP für WMF

Das BMP-Dateiformat , auch bekannt als Bitmap-Bilddatei , geräteunabhängiges Bitmap-Dateiformat (DIB) und Bitmap , ist ein Rastergrafik- Bilddateiformat, das zum Speichern von digitalen Bitmap- Bildern unabhängig vom Anzeigegerät (z. B. einem Grafikadapter ) verwendet wird. insbesondere auf Microsoft Windows- und OS/2- Betriebssystemen.

Das BMP-Dateiformat ist in der Lage, zweidimensionale digitale Bilder in Schwarzweiß und Farbe in verschiedenen Farbtiefen und optional mit Datenkompression , Alphakanälen und Farbprofilen zu speichern . Die Spezifikation Windows Metafile (WMF) deckt das BMP-Dateiformat ab.

Geräteunabhängige Bitmaps und das BMP-Dateiformat

Diagramm 1 – Der Aufbau der Bitmap-Bilddatei
Diagramm 1 – Der Aufbau der Bitmap-Bilddatei

Microsoft hat eine bestimmte Darstellung von Farbbitmaps mit unterschiedlichen Farbtiefen definiert, um den Austausch von Bitmaps zwischen Geräten und Anwendungen mit einer Vielzahl von internen Darstellungen zu erleichtern. Sie nannten diese geräteunabhängigen Bitmaps oder DIBs, und das Dateiformat für sie heißt DIB-Dateiformat oder BMP-Bilddateiformat.

Laut Microsoft-Support:

Eine geräteunabhängige Bitmap (DIB) ist ein Format, das verwendet wird, um geräteunabhängige Bitmaps in verschiedenen Farbauflösungen zu definieren. Der Hauptzweck von DIBs besteht darin, Bitmaps von einem Gerät auf ein anderes zu verschieben (daher der geräteunabhängige Teil des Namens). Eine DIB ist ein externes Format, im Gegensatz zu einer geräteabhängigen Bitmap, die im System als Bitmap-Objekt (von einer Anwendung erstellt...) erscheint. Ein DIB wird normalerweise in Metadateien (normalerweise mit der Funktion StretchDIBits()), BMP-Dateien und der Zwischenablage ( Datenformat CF_DIB ) transportiert.

In den folgenden Abschnitten werden die in der BMP-Datei oder DIB gespeicherten Daten im Detail erläutert. Dies ist das Standard-BMP-Dateiformat. Einige Anwendungen erstellen Bitmap-Bilddateien, die nicht der Microsoft-Dokumentation entsprechen. Außerdem werden nicht alle Felder verwendet; in diesen unbenutzten Feldern wird ein Wert von 0 gefunden.

Dateistruktur

Die Bitmap-Bilddatei besteht aus Strukturen fester Größe (Header) sowie aus Strukturen variabler Größe, die in einer vorgegebenen Reihenfolge erscheinen. Aufgrund der langen Entwicklung dieses Dateiformats können viele verschiedene Versionen einiger dieser Strukturen in der Datei vorkommen.

Bezugnehmend auf das Diagramm 1 besteht die Bitmap-Datei aus Strukturen in der folgenden Reihenfolge:

Strukturname Optional Größe Zweck Kommentare
Header der Bitmap-Datei Nein 14 Byte So speichern Sie allgemeine Informationen über die Bitmap-Bilddatei Wird nicht benötigt, nachdem die Datei in den Speicher geladen wurde
DIB-Header Nein Feste Größe
(7 verschiedene Versionen existieren)
Um detaillierte Informationen über das Bitmap-Bild zu speichern und das Pixelformat zu definieren Direkt folgt der Bitmap-Dateiheader
Zusätzliche Bitmasken Jawohl 3 oder 4 DWORDs
(12 oder 16 Byte)
So definieren Sie das Pixelformat Nur vorhanden, wenn der DIB-Header BITMAPINFOHEADER ist und das Mitglied der Komprimierungsmethode entweder auf BI_BITFIELDS oder BI_ALPHABITFIELDS gesetzt ist
Farbtabelle Halb optional Variable Größe So definieren Sie Farben, die von den Bitmap-Bilddaten verwendet werden (Pixel-Array) Pflicht für Farbtiefen ≤ 8 Bit
Lücke1 Jawohl Variable Größe Strukturausrichtung Ein Artefakt des Datei-Offset-zu-Pixel-Arrays im Bitmap-Dateiheader
Pixel-Array Nein Variable Größe Um die tatsächlichen Werte der Pixel zu definieren Das Pixelformat wird durch den DIB-Header oder Extra-Bitmasken definiert. Jede Zeile im Pixel-Array wird auf ein Vielfaches von 4 Byte aufgefüllt
Lücke2 Jawohl Variable Größe Strukturausrichtung Ein Artefakt des ICC-Profildaten-Offset-Felds im DIB-Header
ICC-Farbprofil Jawohl Variable Größe So definieren Sie das Farbprofil für das Farbmanagement Kann auch einen Pfad zu einer externen Datei enthalten, die das Farbprofil enthält. Wenn es als "non-packed DIB" in den Speicher geladen wird, befindet es sich zwischen der Farbtabelle und Gap1.

DIBs im Speicher

Eine in den Speicher geladene Bitmap-Bilddatei wird zu einer DIB-Datenstruktur – eine wichtige Komponente der Windows GDI-API. Die speicherinterne DIB-Datenstruktur entspricht fast dem BMP-Dateiformat, enthält jedoch nicht den 14-Byte-Bitmap-Dateiheader und beginnt mit dem DIB-Header. Für in den Speicher geladene DIBs kann die Farbtabelle auch aus 16-Bit-Einträgen bestehen, die Indizes für die aktuell realisierte Palette bilden (eine zusätzliche Indirektionsebene), anstelle von expliziten RGB-Farbdefinitionen. In allen Fällen muss das Pixelarray an einer Speicheradresse beginnen, die ein Vielfaches von 4 Byte ist. Bei nicht gepackten DIBs, die in den Speicher geladen werden, sollten die optionalen Farbprofildaten unmittelbar nach der Farbtabelle und vor dem Gap1- und Pixel-Array liegen (anders als in Abbildung 1).

Wenn die Größe von gap1 und gap2 null ist, wird die speicherinterne DIB-Datenstruktur üblicherweise als "gepackter DIB" bezeichnet und kann durch einen einzelnen Zeiger bezeichnet werden, der auf den Anfang des DIB-Headers zeigt. In allen Fällen muss das Pixelarray an einer Speicheradresse beginnen, die ein Vielfaches von 4 Byte ist. In einigen Fällen kann es erforderlich sein, die Anzahl der Einträge in der Farbtabelle anzupassen, um die Speicheradresse des Pixelarrays auf ein Vielfaches von 4 Bytes zu erzwingen. Bei in den Speicher geladenen "gepackten DIBs" sollten die optionalen Farbprofildaten unmittelbar dem Pixelarray folgen, wie in Diag. 1 (mit Lücke1=0 und Lücke2=0).
"Gepackte DIBs" werden von Windows- Zwischenablage-API-Funktionen sowie von einigen gemusterten Windows-Pinsel- und Ressourcenfunktionen benötigt.

Header der Bitmap-Datei

Dieser Byteblock steht am Anfang der Datei und wird verwendet, um die Datei zu identifizieren. Eine typische Anwendung liest diesen Block zuerst, um sicherzustellen, dass die Datei tatsächlich eine BMP-Datei ist und nicht beschädigt ist. Die ersten 2 Bytes des BMP-Dateiformats sind das Zeichen "B", dann das Zeichen "M" in ASCII- Kodierung. Alle ganzzahligen Werte werden im Little-Endian- Format gespeichert (dh das niedrigstwertige Byte zuerst).

Versatz hex Offset dez Größe Zweck
00 0 2 Byte Das Header - Feld verwendet , um die BMP und DIB - Datei zu identifizieren ist 0x42 0x4Din hexadezimal , gleich wie BMin ASCII. Folgende Eingaben sind möglich:
BM
Windows 3.1x, 95, NT, ... usw.
BA
OS/2-Struktur-Bitmap-Array
CI
OS/2-Struktur-Farbsymbol
CP
OS/2 const Farbzeiger
NS
OS/2-Struktursymbol
PT
OS/2-Zeiger
02 2 4 Bytes Die Größe der BMP-Datei in Bytes
06 6 2 Byte Reserviert; Der tatsächliche Wert hängt von der Anwendung ab, die das Bild erstellt, kann bei manueller Erstellung 0 sein
08 8 2 Byte Reserviert; Der tatsächliche Wert hängt von der Anwendung ab, die das Bild erstellt, kann bei manueller Erstellung 0 sein
0A 10 4 Bytes Der Offset, dh die Startadresse des Bytes, in dem die Bitmap-Bilddaten (Pixel-Array) zu finden sind.

DIB-Header (Bitmap-Informationsheader)

Dieser Byteblock teilt der Anwendung detaillierte Informationen über das Bild mit, die verwendet werden, um das Bild auf dem Bildschirm anzuzeigen. Der Block entspricht auch dem von Windows und OS/2 intern verwendeten Header und hat mehrere verschiedene Varianten. Alle enthalten ein Dword-Feld (32-Bit), das ihre Größe angibt, damit eine Anwendung leicht feststellen kann, welcher Header im Bild verwendet wird. Der Grund für die unterschiedlichen Header liegt darin, dass Microsoft das DIB-Format mehrfach erweitert hat. Die neuen erweiterten Header können mit einigen GDI-Funktionen anstelle der älteren verwendet werden und bieten mehr Funktionalität. Da die GDI eine Funktion zum Laden von Bitmap-Dateien unterstützt, verwenden typische Windows-Anwendungen diese Funktionalität. Dies hat zur Folge, dass für solche Anwendungen die von ihnen unterstützten BMP-Formate mit den Formaten übereinstimmen, die von der ausgeführten Windows-Version unterstützt werden. Weitere Informationen finden Sie in der Tabelle unten.

Windows- und OS/2-Bitmap-Header
Größe Kopfzeilenname Betriebssystemunterstützung Merkmale Geschrieben von
12 BITMAPCOREHEADER
OS21XBITMAPHEADER
Windows 2.0 oder höher
OS/2 1.x
64 OS22XBITMAPHEADER OS/2 BITMAPCOREHEADER 2 Fügt Halbton hinzu . Fügt RLE- und Huffman 1D-Komprimierung hinzu.
16 OS22XBITMAPHEADER Diese Variante des vorherigen Headers enthält nur die ersten 16 Bytes und die restlichen Bytes werden als Nullwerte angenommen.

Ein Beispiel für einen solchen Fall ist die Grafik pal8os2v2-16.bmp der BMP Suite.

40 BITMAPINFOHEADER Windows NT , 3.1x oder höher Erweitert die Bitmap-Breite und -Höhe auf 4 Byte. Fügt 16 bpp- und 32 bpp-Formate hinzu. Fügt RLE-Komprimierung hinzu.
52 BITMAPV2INFOHEADER Undokumentiert Fügt RGB-Bitmasken hinzu. Adobe Photoshop
56 BITMAPV3INFOHEADER Nicht offiziell dokumentiert, aber diese Dokumentation wurde in den Foren von Adobe von einem Mitarbeiter von Adobe mit der Aussage veröffentlicht, dass der Standard in der Vergangenheit in der offiziellen MS-Dokumentation enthalten war Fügt eine Alphakanal- Bitmaske hinzu. Adobe Photoshop
108 BITMAPV4HEADER Windows NT 4.0 , 95 oder höher Fügt Farbraumtyp und Gammakorrektur hinzu
124 BITMAPV5HEADER Windows NT 5.0 , 98 oder höher Fügt ICC-Farbprofile hinzu Die Gimpe
Versatz (hex) Versatz (dez) Größe (Byte) OS/2 1.x BITMAPCOREHEADER
0E 14 4 Die Größe dieses Headers (12 Byte)
12 18 2 Die Bitmap-Breite in Pixel (ohne Vorzeichen 16-Bit)
14 20 2 Die Bitmap-Höhe in Pixel (ohne Vorzeichen 16-Bit)
16 22 2 Die Anzahl der Farbebenen muss 1 . betragen
18 24 2 Die Anzahl der Bits pro Pixel
OS/2 1.x-Bitmaps sind unkomprimiert und können nicht 16 oder 32 bpp haben.

Das Windows 2.x BITMAPCOREHEADER unterscheidet sich von dem OS/2 1.x BITMAPCOREHEADER (das in der obigen Tabelle gezeigt wird) in dem einen Detail, dass die Bildbreiten- und -höhefelder ganze Zahlen mit Vorzeichen und nicht ohne Vorzeichen sind.

Versionen nach BITMAPINFOHEADER fügen nur Felder am Ende des Headers der vorherigen Version hinzu. Zum Beispiel: BITMAPV2INFOHEADER fügt Felder BITMAP und BITMAPV3INFOHEADER fügt Felder BITMAPV2INFOHEADER .

Ein integrierter Alphakanal wurde mit dem undokumentierten BITMAPV3INFOHEADER und mit dem dokumentierten BITMAPV4HEADER (seit Windows 95 ) eingeführt und wird innerhalb von Windows XP Logon und Theme System sowie Microsoft Office (seit v2000) verwendet; es wird von einigen Bildbearbeitungsprogrammen wie Adobe Photoshop seit Version 7 und Adobe Flash seit Version MX 2004 (damals bekannt als Macromedia Flash) unterstützt. Es wird auch von GIMP , Google Chrome , Microsoft PowerPoint und Microsoft Word unterstützt .

Aus Kompatibilitätsgründen verwenden die meisten Anwendungen die älteren DIB-Header zum Speichern von Dateien. Da OS/2 nach Windows 2000 nicht mehr unterstützt wird, ist das gängige Windows-Format derzeit der BITMAPINFOHEADER- Header. Eine Beschreibung finden Sie in der nächsten Tabelle. Alle Werte werden als vorzeichenlose Ganzzahlen gespeichert, sofern nicht explizit angegeben.

Versatz (hex) Versatz (dez) Größe (Byte) Windows BITMAPINFOHEADER
0E 14 4 die Größe dieses Headers in Byte (40)
12 18 4 die Bitmap-Breite in Pixel (Integer mit Vorzeichen)
16 22 4 die Bitmap-Höhe in Pixel (Ganzzahl mit Vorzeichen)
1A 26 2 die Anzahl der Farbebenen (muss 1 sein)
1C 28 2 die Anzahl der Bits pro Pixel, die die Farbtiefe des Bildes ist. Typische Werte sind 1, 4, 8, 16, 24 und 32.
1E 30 4 das verwendete Kompressionsverfahren. Eine Liste der möglichen Werte finden Sie in der nächsten Tabelle
22 34 4 die Bildgröße. Dies ist die Größe der rohen Bitmap-Daten; für BI_RGB-Bitmaps kann ein Dummy 0 angegeben werden.
26 38 4 die horizontale Auflösung des Bildes. (Pixel pro Meter, ganze Zahl mit Vorzeichen)
2A 42 4 die vertikale Auflösung des Bildes. (Pixel pro Meter, ganze Zahl mit Vorzeichen)
2E 46 4 die Anzahl der Farben in der Farbpalette, oder 0 für den Standardwert 2 n
32 50 4 die Anzahl der verwendeten wichtigen Farben oder 0, wenn jede Farbe wichtig ist; allgemein ignoriert

Die Komprimierungsmethode (Offset 30) kann sein:

Wert Identifiziert von Kompressionsverfahren Kommentare
0 BI_RGB keiner Am gebräuchlichsten
1 BI_RLE8 RLE 8-Bit/Pixel Kann nur mit 8-Bit/Pixel-Bitmaps verwendet werden
2 BI_RLE4 RLE 4-Bit/Pixel Kann nur mit 4-Bit/Pixel-Bitmaps verwendet werden
3 BI_BITFIELDS OS22XBITMAPHEADER : Huffman 1D BITMAPV2INFOHEADER : RGB-
Bitfeldmasken , BITMAPV3INFOHEADER + : RGBA
4 BI_JPEG OS22XBITMAPHEADER : RLE-24 BITMAPV4INFOHEADER + : JPEG- Bild zum Drucken
5 BI_PNG BITMAPV4INFOHEADER + : PNG- Bild zum Drucken
6 BI_ALPHABITFIELDS RGBA-Bitfeldmasken nur Windows CE 5.0 mit .NET 4.0 oder höher
11 BI_CMYK keiner nur Windows Metafile CMYK
12 BI_CMYKRLE8 RLE-8 nur Windows Metafile CMYK
13 BI_CMYKRLE4 RLE-4 nur Windows Metafile CMYK

Ein OS/2 2.x OS22XBITMAPHEADER ( BITMAPINFOHEADER2 in der Dokumentation von IBM) enthält 24 zusätzliche Bytes:

Versatz (hex) Versatz (dez) Größe (Byte) OS/2 OS22XBITMAPHEADER ( BITMAPINFOHEADER2 )
36 54 2 Ein Aufzählungswert, der die Einheiten für die horizontale und vertikale Auflösung angibt (Offsets 38 und 42). Der einzige definierte Wert ist 0, also Pixel pro Meter
38 56 2 Polsterung. Ignoriert und sollte null sein
3A 58 2 Ein Aufzählungswert, der die Richtung angibt, in der die Bits die Bitmap füllen. Der einzige definierte Wert ist 0, was bedeutet, dass der Ursprung die untere linke Ecke ist. Bits füllen sich von links nach rechts, dann von unten nach oben.

Beachten Sie, dass Windows-Bitmaps (die dieses Feld nicht enthalten) auch einen oberen linken Ursprung angeben können (Bits füllen sich von links nach rechts, dann von oben nach unten), indem Sie einen negativen Wert für die Bildhöhe verwenden

3C 60 2 Ein Aufzählungswert, der einen Rasteralgorithmus angibt, der beim Rendern des Bildes verwendet werden sollte.
40 64 4 Halbtonparameter 1 (siehe unten)
44 68 4 Halbtonparameter 2 (siehe unten)
48 72 4 Ein Aufzählungswert, der die Farbcodierung für jeden Eintrag in der Farbtabelle angibt. Der einzige definierte Wert ist 0, was RGB angibt.
4C 76 4 Ein anwendungsdefinierter Bezeichner. Wird nicht zum Rendern von Bildern verwendet

Der Rasteralgorithmus (Offset 60) kann sein:

Wert Halbton-Algorithmus Kommentare
0 keiner Am gebräuchlichsten
1 Fehlerdiffusion Halbtonparameter 1 (Offset 64) ist der Prozentsatz der Fehlerdämpfung. 100 bedeutet keine Dämpfung. 0 bedeutet, dass Fehler nicht verbreitet werden
2 PANDA: Verarbeitungsalgorithmus für die Erfassung von unverschlüsselten Dokumenten Die Halbtonparameter 1 und 2 (Offsets 64 bzw. 68) repräsentieren die X- und Y-Dimensionen in Pixeln des verwendeten Halbtonmusters
3 Superkreis Die Halbtonparameter 1 und 2 (Offsets 64 bzw. 68) repräsentieren die X- und Y-Dimensionen in Pixeln des verwendeten Halbtonmusters

Farbtabelle

Die Farbtabelle (Palette) steht in der BMP-Bilddatei direkt nach dem BMP-Datei-Header, dem DIB-Header und nach den optionalen drei oder vier Bitmasken, wenn der BITMAPINFOHEADER- Header mit BI_BITFIELDS (12 Byte) oder BI_ALPHABITFIELDS (16 Byte) verwendet wird . Daher ist sein Offset die Größe des BITMAPFILEHEADER plus die Größe des DIB-Headers (plus optional 12-16 Bytes für die drei oder vier Bitmasken).
Hinweis: Unter Windows CE kann der BITMAPINFOHEADER- Header mit der Option BI_ALPHABITFIELDS im biCompression-Member verwendet werden.

Die Anzahl der Einträge in der Palette beträgt entweder 2 n (wobei n die Anzahl der Bits pro Pixel ist) oder eine kleinere Zahl, die im Header angegeben ist (im OS/2 BITMAPCOREHEADER Header-Format wird nur die volle Palette unterstützt). In den meisten Fällen belegt jeder Eintrag in der Farbtabelle 4 Byte in der Reihenfolge Blau, Grün, Rot, 0x00 (Ausnahmen siehe unten). Dieser wird im BITMAPINFOHEADER unter der Funktion biBitCount indiziert .

Die Farbtabelle ist ein Block von Bytes (eine Tabelle), die die vom Bild verwendeten Farben auflistet. Jedes Pixel in einem indizierten Farbbild wird durch eine Anzahl von Bits (1, 4 oder 8) beschrieben, die ein Index einer einzelnen Farbe sind, die durch diese Tabelle beschrieben wird. Der Zweck der Farbpalette in indizierten Farbbitmaps besteht darin, die Anwendung über die tatsächliche Farbe zu informieren, der jeder dieser Indexwerte entspricht. Der Zweck der Farbtabelle in nicht indizierten (nicht palettierten) Bitmaps besteht darin, die von der Bitmap verwendeten Farben zum Zwecke der Optimierung auf Geräten mit eingeschränkter Farbwiedergabefähigkeit aufzulisten und die zukünftige Konvertierung in andere Pixelformate und Palettierung zu erleichtern.

Die Farben in der Farbtabelle werden normalerweise im RGBA32- Format mit 4 Byte pro Eintrag angegeben . Die mit dem OS/2 BITMAPCOREHEADER verwendete Farbtabelle verwendet das RGB24- Format mit 3 Byte pro Eintrag . Für im Speicher geladene DIBs kann die Farbtabelle optional aus 2-Byte-Einträgen bestehen – diese Einträge sind Indizes für die aktuell realisierte Palette anstelle expliziter RGB-Farbdefinitionen.

Microsoft verbietet nicht das Vorhandensein einer gültigen Alphakanal-Bitmaske in BITMAPV4HEADER und BITMAPV5HEADER für 1bpp, 4bpp und 8bpp indizierte Farbbilder, was darauf hinweist, dass die Farbtabelleneinträge auch eine Alphakomponente mit 8.8.8.[0-8 . angeben können ].[0-8] -Format über das RGBQUAD.rgbReserved-Member. Einige Versionen der Microsoft-Dokumentation verbieten diese Funktion jedoch, indem sie angeben, dass das RGBQUAD.rgbReserved-Mitglied „null“ sein muss.

Wie oben erwähnt, wird die Farbtabelle normalerweise nicht verwendet, wenn die Pixel im Format 16 Bit pro Pixel (16 bpp) (und höher) vorliegen; Normalerweise gibt es in diesen Bitmap-Bilddateien keine Farbtabelleneinträge. Die Microsoft-Dokumentation (auf der MSDN-Website vom 16. November 2010) gibt jedoch an, dass für 16 bpp (und höher) die Farbtabelle vorhanden sein kann, um eine Liste von Farben zu speichern, die zur Optimierung auf Geräten mit eingeschränkter Farbanzeigefähigkeit bestimmt sind , während es auch angibt, dass in solchen Fällen keine indizierten Paletteneinträge in dieser Farbtabelle vorhanden sind. Dies mag widersprüchlich erscheinen, wenn nicht zwischen den obligatorischen Paletteneinträgen und der optionalen Farbliste unterschieden wird.

Pixelspeicher

Die Bits, die die Bitmap-Pixel darstellen, sind in Zeilen gepackt . Die Größe jeder Zeile wird durch Auffüllen auf ein Vielfaches von 4 Byte (ein 32-Bit- DWORD ) aufgerundet .

Bei Bildern mit einer Höhe über 1 werden mehrere aufgefüllte Zeilen nacheinander gespeichert und bilden ein Pixel-Array.

Die Gesamtanzahl an Bytes, die zum Speichern einer Pixelzeile erforderlich ist, kann wie folgt berechnet werden:

ImageWidth wird in Pixeln ausgedrückt. Die obige Gleichung verwendet die Boden- und Deckenfunktionen .

Die Gesamtzahl der Bytes, die erforderlich ist, um ein Pixelarray in einem Bild mit n Bits pro Pixel (bpp) mit 2 n Farben zu speichern , kann berechnet werden, indem der Effekt der Aufrundung der Größe jeder Zeile auf ein Vielfaches von 4 Byte berücksichtigt wird , wie folgt:

PixelArraySize = RowSize · | Bildhöhe |
ImageHeight wird in Pixeln ausgedrückt. Der absolute Wert ist erforderlich, da ImageHeight bei Top-Down-Bildern als negative Zahl ausgedrückt wird.

Pixelarray (Bitmap-Daten)

Das Pixelarray ist ein Block von 32-Bit-DWORDs, der das Bild Pixel für Pixel beschreibt. Normalerweise werden Pixel "von unten nach oben" gespeichert, beginnend in der unteren linken Ecke, von links nach rechts und dann zeilenweise von unten nach oben im Bild. Sofern nicht BITMAPCOREHEADER verwendet wird, können auch unkomprimierte Windows-Bitmaps von oben nach unten gespeichert werden, wenn der Wert für die Bildhöhe negativ ist.

In der ursprünglichen OS/2-DIB waren die einzigen vier zulässigen Werte für die Farbtiefe 1, 4, 8 und 24 Bits pro Pixel (bpp). Moderne DIB-Header ermöglichen Pixelformate mit 1, 2, 4, 8, 16, 24 und 32 Bit pro Pixel (bpp). GDI+ erlaubt auch 64 Bit pro Pixel.

Füllbytes (nicht unbedingt 0) müssen an das Ende der Zeilen angehängt werden, um die Länge der Zeilen auf ein Vielfaches von vier Bytes zu erhöhen. Wenn das Pixelarray in den Speicher geladen wird, muss jede Zeile an einer Speicheradresse beginnen, die ein Vielfaches von 4 ist. Diese Adress-/Offsetbeschränkung ist nur für Pixelarrays, die in den Speicher geladen werden, obligatorisch. Für Dateispeicherzwecke muss nur die Größe jeder Zeile ein Vielfaches von 4 Byte sein, während der Datei-Offset beliebig sein kann. Eine 24-Bit-Bitmap mit Width=1 hätte 3 Byte Daten pro Zeile (blau, grün, rot) und 1 Byte Padding, während Width=2 6 Byte Daten und 2 Byte Padding haben würde, Width=3 hätte 9 Byte Daten und 3 Byte Padding, und Width=4 hätte 12 Byte Daten und kein Padding.

Kompression

  • Indizierte Farbbilder können mit 4-Bit- oder 8-Bit- RLE- oder Huffman- 1D-Algorithmus komprimiert werden.
  • OS/2 BITMAPCOREHEADER 2 24bpp- Bilder können mit dem 24-Bit-RLE-Algorithmus komprimiert werden.
  • Die 16bpp- und 32bpp- Bilder werden immer unkomprimiert gespeichert.
  • Beachten Sie, dass Bilder in allen Farbtiefen auf Wunsch ohne Komprimierung gespeichert werden können.

Pixelformat

  • Das 1-Bit-pro-Pixel-Format (1bpp) unterstützt 2 verschiedene Farben (zum Beispiel: Schwarz und Weiß). Die Pixelwerte werden in jedem Bit gespeichert, wobei das erste (am weitesten links liegende) Pixel im höchstwertigen Bit des ersten Bytes liegt. Jedes Bit ist ein Index in eine Tabelle mit 2 Farben. Ein nicht gesetztes Bit bezieht sich auf den ersten Farbtabelleneintrag und ein gesetztes Bit bezieht sich auf den letzten (zweiten) Farbtabelleneintrag.
  • Das Format mit 2 Bit pro Pixel (2 bpp) unterstützt 4 verschiedene Farben und speichert 4 Pixel pro 1 Byte, wobei sich das am weitesten links stehende Pixel in den beiden höchstwertigen Bits befindet (nur Windows CE :). Jeder Pixelwert ist ein 2-Bit-Index in eine Tabelle mit bis zu 4 Farben.
  • Das Format mit 4 Bit pro Pixel (4 bpp) unterstützt 16 verschiedene Farben und speichert 2 Pixel pro 1 Byte, wobei sich das am weitesten links stehende Pixel im höherwertigen Halbbyte befindet . Jeder Pixelwert ist ein 4-Bit-Index in eine Tabelle mit bis zu 16 Farben.
  • Das 8-Bit pro Pixel (8bpp)-Format unterstützt 256 verschiedene Farben und speichert 1 Pixel pro 1 Byte. Jedes Byte ist ein Index in eine Tabelle mit bis zu 256 Farben.
  • Das 16-Bit-pro-Pixel-Format (16 bpp) unterstützt 65536 verschiedene Farben und speichert 1 Pixel pro 2-Byte-WORD. Jedes WORD kann die Alpha-, Rot-, Grün- und Blau- Samples des Pixels definieren.
  • Das 24-Bit-Pixel-Format (24bpp) unterstützt 16.777.216 verschiedene Farben und speichert 1 Pixelwert pro 3 Byte. Jeder Pixelwert definiert die roten, grünen und blauen Samples des Pixels (8.8.8.0.0 in RGBAX-Notation). Genauer gesagt in der Reihenfolge: Blau, Grün und Rot (8 Bits pro Abtastwert).
  • Das 32-Bit-pro-Pixel-Format (32bpp) unterstützt 4.294.967.296 verschiedene Farben und speichert 1 Pixel pro 4-Byte-DWORD. Jedes DWORD kann die Alpha-, Rot-, Grün- und Blau-Samples des Pixels definieren.

Um die Mehrdeutigkeit aufzulösen, welche Bits welche Abtastwerte definieren, stellen die DIB-Header bestimmte Voreinstellungen sowie spezifische BITFELDER bereit, die Bitmasken sind, die die Zugehörigkeit einer bestimmten Gruppe von Bits in einem Pixel zu einem bestimmten Kanal definieren . Das folgende Diagramm definiert diesen Mechanismus:

Diag.  2 – Der BITFIELDS-Mechanismus für ein 32-Bit-Pixel, dargestellt in RGBAX-Sample-Length-Notation
Diag. 2 – Der BITFIELDS-Mechanismus für ein 32-Bit-Pixel, dargestellt in RGBAX-Sample-Length-Notation

Die durch die Bitmasken BITFIELDS definierten Abtastfelder müssen zusammenhängend und nicht überlappend sein, aber die Reihenfolge der Abtastfelder ist willkürlich. Die am weitesten verbreitete Halbbildreihenfolge ist: Alpha, Blau, Grün, Rot (MSB zu LSB). Die roten, grünen und blauen Bitmasken sind nur gültig, wenn das Compression-Member des DIB-Headers auf BI_BITFIELDS gesetzt ist. Die Alpha-Bitmaske ist gültig, wenn sie im DIB-Header vorhanden ist oder wenn das Compression-Member des DIB-Headers auf BI_ALPHABITFIELDS (nur Windows CE ) festgelegt ist.

Diag.  3 – Das Pixelformat mit einem Alphakanal für ein 16-Bit-Pixel (in RGBAX-Sample-Length-Notation), das tatsächlich von Adobe Photoshop generiert wurde[21]
Diag. 3 – Das Pixelformat mit einem Alphakanal für ein 16-Bit-Pixel (in RGBAX-Sample-Length-Notation), das tatsächlich von Adobe Photoshop generiert wurde
Alle möglichen Pixelformate in einer DIB
Alle möglichen Pixelformate in einer DIB

RGB-Videountertypen

Der oben beschriebene BITFIELD-Mechanismus erlaubt die Definition von Zehntausenden verschiedener Pixelformate, von denen jedoch nur einige in der Praxis verwendet werden, alle palettierten Formate RGB8, RGB4 und RGB1 (in der obigen Tabelle gelb markiert, dshow.hMEDIASUBTYPE-Namen) und:

Unkomprimierte RGB-Videountertypen
RGBAX RGB-Untertyp RGBAX ARGB-Untertyp
8.8.8.0.8 RGB32 8.8.8.8.0 ARGB32
10.10.10.2.0 A2R10G10B10
8.8.8.0.0 RGB24 10.10.10.2.0 A2B10G10R10
5.6.5.0.0 RGB565 4.4.4.4.0 ARGB4444
5.5.5.0.1 RGB555 5.5.5.1.0 ARGB1555
Bitfelder für zehn RGB-Bits
Bitfeld Versatz Bits A2R10G10B10 Bits A2B10G10R10
rot 36h 00 00 F0 3F LE: 3FF00000 2029 FF 03 00 00 LE: 000003FF  0 9
Grün 3Ah 00 FC 0F 00 LE: 000FFC00 1019 00 FC 0F 00 LE: 000FFC00 1019
Blau 3Eh FF 03 00 00 LE: 000003FF  0 9 00 00 F0 3F LE: 3FF00000 2029
Alpha 42h 00 00 00 C0 LE: C0000000 3031 00 00 00 C0 LE: C0000000 3031

In Version 2.1.4 unterstützt FFmpeg (in seiner eigenen Terminologie) die BMP-Pixelformate bgra, bgr24, rgb565le, rgb555le, rgb444le, rgb8, bgr8, rgb4_byte, bgr4_byte, grey, pal8 und monob ; dh bgra war das einzige unterstützte Pixelformat mit Transparenz.

Beispiel 1 einer 2×2-Pixel-Bitmap mit 24 Bit/Pixel-Kodierung

Beispiel 1

Es folgt ein Beispiel für eine 2×2-Pixel, 24-Bit-Bitmap (Windows DIB-Header BITMAPINFOHEADER ) mit dem Pixelformat RGB24.

Versatz Größe Hex-Wert Wert Beschreibung
BMP-Header
0h 2 42 4D "BM" ID-Feld (42h, 4Dh)
2h 4 46 00 00 00 70 Byte (54+16) Größe der BMP-Datei (54 Byte Header + 16 Byte Daten)
6h 2 00 00 Ungebraucht Anwendungsspezifisch
8h 2 00 00 Ungebraucht Anwendungsspezifisch
Ah 4 36 00 00 00 54 Byte (14+40) Offset, wo das Pixel-Array (Bitmap-Daten) zu finden ist
DIB-Header
Äh 4 28 00 00 00 40 Byte Anzahl Bytes im DIB-Header (ab diesem Punkt)
12h 4 02 00 00 00 2 Pixel (von links nach rechts) Breite der Bitmap in Pixel
16h 4 02 00 00 00 2 Pixel (von unten nach oben) Höhe der Bitmap in Pixel. Positiv für die Pixelreihenfolge von unten nach oben.
1Ah 2 01 00 1 Flugzeug Anzahl der verwendeten Farbebenen
1Ch 2 18 00 24 Bit Anzahl Bits pro Pixel
1Eh 4 00 00 00 00 0 BI_RGB, keine Pixel-Array-Komprimierung verwendet
22h 4 10 00 00 00 16 Byte Größe der rohen Bitmap-Daten (einschließlich Padding)
26h 4 13 0B 00 00 2835 Pixel/Meter horizontal Druckauflösung des Bildes,
72 DPI × 39,3701 Zoll pro Meter ergibt 2834,6472
2Ah 4 13 0B 00 00 2835 Pixel/Meter vertikal
2Eh 4 00 00 00 00 0 Farben Anzahl der Farben in der Palette
32h 4 00 00 00 00 0 wichtige Farben 0 bedeutet, dass alle Farben wichtig sind
Beginn des Pixelarrays (Bitmap-Daten)
36h 3 00 00 FF 0 0 255 Rot, Pixel (0,1)
39h 3 FF FF FF 255 255 255 Weiß, Pixel (1,1)
3Ch 2 00 00 0 0 Padding für 4-Byte-Ausrichtung (könnte ein anderer Wert als Null sein)
3Eh 3 FF 00 00 255 0 0 Blau, Pixel (0,0)
41h 3 00 FF 00 0 255 0 Grün, Pixel (1,0)
44h 2 00 00 0 0 Padding für 4-Byte-Ausrichtung (könnte ein anderer Wert als Null sein)
0,0: blue 0000FF FF 0,1: green 00FF00 FF 0,2: red FF00000 FF 0,3: white FFFFFF FF 1,0: blue 0000FF 7F, half transparent 1,1: green 00FF00 7F, half transparent 1,2: red FF0000 7F, half transparent 1,3: white FFFFFF 7F, half transparent
Über dieses Bild
Beispiel 2 einer 4×2-Pixel-Bitmap mit 32-Bit/Pixel-Codierung

Beispiel 2

Es folgt ein Beispiel für eine 4×2-Pixel, 32-Bit-Bitmap mit Opazitätswerten im Alphakanal (Windows DIB Header BITMAPV4HEADER ) mit Pixelformat ARGB32.

Versatz Größe Hex-Wert Wert Beschreibung
BMP-Header
0h 2 42 4D "BM" ID-Feld (42h, 4Dh)
2h 4 9A 00 00 00 154 Byte (122+32) Größe der BMP-Datei
6h 2 00 00 Ungebraucht Anwendungsspezifisch
8h 2 00 00 Ungebraucht Anwendungsspezifisch
Ah 4 7A 00 00 00 122 Byte (14+108) Offset, wo das Pixel-Array (Bitmap-Daten) zu finden ist
DIB-Header
Äh 4 6C 00 00 00 108 Byte Anzahl Bytes im DIB-Header (ab diesem Punkt)
12h 4 04 00 00 00 4 Pixel (von links nach rechts) Breite der Bitmap in Pixel
16h 4 02 00 00 00 2 Pixel (von unten nach oben) Höhe der Bitmap in Pixel
1Ah 2 01 00 1 Flugzeug Anzahl der verwendeten Farbebenen
1Ch 2 20 00 32 Bit Anzahl Bits pro Pixel
1Eh 4 03 00 00 00 3 BI_BITFIELDS, keine Pixel-Array-Komprimierung verwendet
22h 4 20 00 00 00 32 Byte Größe der rohen Bitmap-Daten (einschließlich Padding)
26h 4 13 0B 00 00 2835 Pixel/Meter horizontal Druckauflösung des Bildes,
72 DPI × 39,3701 Zoll pro Meter ergibt 2834,6472
2Ah 4 13 0B 00 00 2835 Pixel/Meter vertikal
2Eh 4 00 00 00 00 0 Farben Anzahl der Farben in der Palette
32h 4 00 00 00 00 0 wichtige Farben 0 bedeutet, dass alle Farben wichtig sind
36h 4 00 00 FF 00 00FF0000 in Big-Endian Bitmaske des roten Kanals (gültig, weil BI_BITFIELDS angegeben ist)
3Ah 4 00 FF 00 00 0000FF00 in Big-Endian Grüne Kanalbitmaske (gültig, da BI_BITFIELDS angegeben ist)
3Eh 4 FF 00 00 00 000000FF in Big-Endian Bitmaske des blauen Kanals (gültig, weil BI_BITFIELDS angegeben ist)
42h 4 00 00 00 FF FF000000 in Big-Endian Alphakanal-Bitmaske
46h 4 20 6E 69 57 Little-Endian " Win " LCS_WINDOWS_COLOR_SPACE
4Ah 24h 24h* 00...00 CIEXYZTRIPLE-Farbraum-Endpunkte Unbenutzt für LCS " Win " oder " sRGB"
6Eh 4 00 00 00 00 0 Rotes Gamma Unbenutzt für LCS " Win " oder " sRGB"
72h 4 00 00 00 00 0 Grünes Gamma Unbenutzt für LCS " Win " oder " sRGB"
76h 4 00 00 00 00 0 Blaues Gamma Unbenutzt für LCS " Win " oder " sRGB"
Beginn des Pixel-Arrays (der Bitmap-Daten)
7Ah 4 FF 00 00 7F 255 0 0 127 Blau (Alpha: 127), Pixel (1,0)
7Eh 4 00 FF 00 7F 0 255 0 127 Grün (Alpha: 127), Pixel (1,1)
82h 4 00 00 FF 7F 0 0 255 127 Rot (Alpha: 127), Pixel (1,2)
86h 4 FF FF FF 7F 255 255 255 127 Weiß (Alpha: 127), Pixel (1,3)
8Ah 4 FF 00 00 FF 255 0 0 255 Blau (Alpha: 255), Pixel (0,0)
8Eh 4 00 FF 00 FF 0 255 0 255 Grün (Alpha: 255), Pixel (0,1)
92h 4 00 00 FF FF 0 0 255 255 Rot (Alpha: 255), Pixel (0,2)
96h 4 FF FF FF FF 255 255 255 255 Weiß (Alpha: 255), Pixel (0,3)

Beachten Sie, dass die Bitmap-Daten mit der unteren linken Ecke des Bildes beginnen.

Verwendung des BMP-Formats

Die Einfachheit des BMP-Dateiformats und seine weit verbreitete Vertrautheit in Windows und anderswo sowie die Tatsache, dass dieses Format relativ gut dokumentiert ist und ein offenes Format hat , machen BMP zu einem sehr verbreiteten Format, das Bildverarbeitungsprogramme vieler Betriebssysteme können lesen und Schreiben. ICO- und CUR-Dateien enthalten Bitmaps, die mit einem BITMAPINFOHEADER beginnen.

Viele ältere grafische Benutzeroberflächen verwendeten Bitmaps in ihren integrierten Grafiksubsystemen; beispielsweise die Microsoft Windows und OS / 2 - Plattformen GDI verwendet Subsystem, wo das spezifische Format das ist Windows und OS / 2 Bitmap - Datei - Format , in der Regel mit der Namen Dateierweiterung von .BMP.

Während die meisten BMP-Dateien aufgrund des Fehlens jeglicher Komprimierung (oder im Allgemeinen einer Low-Ratio -Lauflängencodierung bei palettierten Bildern) eine relativ große Dateigröße haben , können viele BMP-Dateien mit verlustfreien Datenkomprimierungsalgorithmen wie ZIP erheblich komprimiert werden, da sie redundante . enthalten Daten. Einige Formate wie RAR enthalten sogar Routinen, die speziell auf eine effiziente Komprimierung solcher Daten ausgerichtet sind.

Verwandte Formate

Das X Window System verwendet ein ähnliches XBM- Format für Schwarzweißbilder und XPM ( Pixelmap ) für Farbbilder. Es gibt auch eine Vielzahl von "rohen" Formaten, die Rohdaten ohne weitere Informationen speichern. Die Formate Portable Pixmap (PPM) und Truevision TGA existieren ebenfalls, werden aber seltener verwendet – oder nur für spezielle Zwecke; TGA kann beispielsweise Transparenzinformationen enthalten.

Verweise

Externe Links