====== LU03e - Bitmap ======
Nachdem wir im Kapitel [[modul:m114:learningunits:lu03:bildformate]] die wichtigsten Begriffe definiert haben, werden wir uns das Bitmap-Format genauer anschauen.
Dieses Format verzichtet fast vollständig auf Tricks zur Reduktion des Speicherbedarfs.
Dadurch ist es recht gut nachvollziehbar.
//Siehe auch [[http://de.wikipedia.org/wiki/Windows_Bitmap]]//
Im Bitmap-Format wird ein Bild als zweidimensionales Raster von Pixeln gespeichert.
Dieses Raster mit den einzelnen Pixeln wird "Bitmap" genannt, woher das Format auch seinen Namen hat.
Zu jedem einzelnen Pixel wird die entsprechende Farbinformation gespeichert.
Alle Informationen sind als binär codierte Ganzzahlen gespeichert.
Je nach Länge entspricht dies den Datentypen **byte**, **short** oder **int**.
Die Datei besteht aus drei Teilen:
==== Dateikopf ====
Die ersten 14 Byte der Datei sind der Dateikopf.
Im Dateikopf werden einige allgemeine Angaben zum Bild gespeichert:
^ Position ^ Länge ^ Name ^ Beschreibung ^
^ (Hex) ^ (Byte) ^ ::: ^
| 00 | 2 | bfType | Dateityp "BM", ASCII-Zeichenkette ''42 4D''16 |
| 02 | 4 | bfSize | Grösse der Datei in Byte (unzuverlässig) |
| 06 | 4 | bfReserved | Reservierter Bereich, standardmässig **0** |
| 0A | 4 | bfOffBits | Startposition der Bilddaten. |
Leider wird der Dateikopf nicht von allen Programmen korrekt verarbeitet.
Dies führt unter anderem dazu, dass die Dateigrösse falsch abgefüllt wird.
==== Informationsblock ====
Direkt nach dem Dateikopf folgt der Informationsblock.
Der Informationsblock besteht aus den Bitmap-Eigenschaften und einer eventuellen Farbmaske und Farbtabelle.
=== Bitmap-Eigenschaften ===
Dieser Block enthält unter anderem Angaben zur Grösse des Bildes und der Farbtiefe der einzelnen Pixel.
^ Position ^ Länge ^ Name ^ Beschreibung ^
^ (Hex) ^ (Byte) ^ ::: ^
| 0E | 4 | biSize | Grösse des Informationsblocks in Byte; Wert=4010 / 2816 |
| 12 | 4 | biWidth | Breite der Bitmap in Pixeln |
| 16 | 4 | biHeight | Die Höhe der Bitmap in Pixeln \\ Ein positiver Wert (Normalfall) bedeutet, dass die einzelnen Zeilen von unten nach oben beschrieben sind. \\ Ein negativer Wert bedeutet, dass die Zeilen von oben nach unten beschrieben sind. |
| 1A | 2 | biPlane | Wurde in älteren Formaten verwendet. In Bitmap-Dateien immer **1**. |
| 1C | 2 | biBitCount | Gibt die Farbtiefe der Bitmap an. Gültige Werte: **1**, **4**, **8**, **16**, **24** oder **32**. (Siehe http://msdn.microsoft.com/en-us/library/windows/desktop/dd183376%28v=vs.85%29.aspx) |
| 1E | 4 | biCompression | Gibt die Art der Komprimierung an (siehe http://msdn.microsoft.com/en-us/library/windows/desktop/dd183376%28v=vs.85%29.aspx). |
| 22 | 4 | biSizeImage | Grösse der Bilddaten in Byte. |
| 26 | 4 | biXPelsPerMeter | Horizontale Auflösung des Ziel-Ausgabegeräts, in der Regel **0**. |
| 2A | 4 | biYPelsPerMeter | Vertikale Auflösung des Ziel-Ausgabegeräts, in der Regel **0**. |
| 2E | 4 | biClrUsed | Anzahl der Einträge in der Farbtabelle. |
| 32 | 4 | biClrImportant | Anzahl der verwendeten Einträge in der Farbtabelle. |
=== Vorsicht: Verkehrte Welt ===
**Bei den einzelnen Werte sind die Zahlen in der verkehrten Reihenfolge gespeichert.**
Beispiel:
* Breite des Bildes: 2000 Bit
* Hexadezimale Darstellung: 00 00 07 D0
* Gespeicherte Information: D0 07 00 00
Es werden also die einzelnen Zahlenblöcke von rechts nach links gespeichert.
==== Bilddaten ====
Die eigentlichen Bilddaten stellen den letzten und grössten Block dar.
Der Startpunkt innerhalb der Datei steht im Feld ''bfOffBits'' im Dateikopf.
Die Bilddaten enthalten die Farbinformation der Pixel Zeile für Zeile von links nach rechts.
Wie die Farbinformation der einzelnen Pixel gespeichert wird, hängt von der Farbtiefe (''bfBitCount'') und der Komprimierung (''bfCompression'') ab.
Es würde zu weit führen, sämtliche Varianten zu beschreiben.
Daher beschränke ich mich an dieser Stelle auf zwei exemplarische Varianten.
=== 24 Bit pro Pixel / keine Kompression ===
Die Farbinformation besteht aus je 8 Bit (1 Byte) für die Farben Blau, Grün und Rot.
Somit können 16'777'216 verschiedene Farben gespeichert werden.
Diese Art der Codierung verwenden wir auch für die Angabe einer Farbe in Stylesheets (CSS).
Zum Beispiel ''background-color: #cc9933;''.
Allerdings ist die Reihenfolge der Farben umgekehrt:
* Stylesheet: Rot Grün Blau
* Bitmap: Blau Grün Rot
=== 1,4 oder 8 Bit pro Pixel / keine Kompression ===
Bei dieser Art der Codierung steht die Farbinformation in einer Farbtabelle.
Die Daten des Pixels enthalten den Index der jeweiligen Farbe in der Farbtabelle.
\\
**Beispiel Auszug aus einer Bitmap-Datei:**
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 42 4d 2a 75 03 00 00 00 00 00 36 00 00 00 28 00
1 00 00 4c 02 00 00 c6 02 00 00 01 00 08 00 00 00
2 00 00 f4 74 03 00 00 00 00 00 00 00 00 00 00 00
3 00 00 00 00 00 00 ff ff ff ff ff ff ff ff ff ff
===== Informationen aus einer Bitmap lesen =====
== 1. Welche Information suche ich? ==
**Annahme:** Ich möchte die Breite des Bildes (Bitmap) kennen.
Dazu suche ich im Dateikopf oder Informationsblock wo die gewünschte Information gespeichert ist:
* Name: biWidth
* (Start)Position: 1216
* Länge: 4 Byte
== 2. Wert ablesen ==
Aus der Bitmap-Datei suche ich die Startposition.
Dann übernehme so viele Bytes, wie die Länge angibt.
Im oben stehenden Auszug wäre das.
** 4c 02 00 0016 **
== 3. Umrechnen ==
In der Bitmapdatei sind die Bytes in der falschen Reihenfolge gespeichert.
Bevor ich nun ins Dezimalsystem umrechne, korrigiere ich die Reihenfolge:
**4c 02 00 0016** => **00 00 02 4c16**
Nun fehlt noch die Umrechnung ins Dezimalsystem und schon weiss ich:
Die Breite des Bildes beträgt 588 Pixel.
----
{{tag>m114-A0G}}
[[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] Marcel Suter