25.11 Das bmp-Format
 
  Eine bmp-Datei beinhaltet genau ein Bild, die Farbtiefe und die Größe sind dabei frei. Die Endung bmp der Datei sorgt bei Klicken auf den Dateinamen dafür, dass bei entsprechender Verknüpfung ein Programm gestartet wird, das die Daten der Datei als Bitmap-Bild zu interpretieren sind. Das kann aber nur funktionieren, wenn in der Datei selbst einige wichtige Informatioenn über die Datei stehen. Eine korrekte bmp-Datei besitzt demnach einen Header, genauer zwei Header, einen mit Informationen über die Datei und einen über das Format des Bildes.
Header 1 Der erste Header (siehe unten den hellgrau unterlegten Teil der Tabelle) belegt genau die ersten 14 byte der Datei. Die ersten beiden werden grundsätzlich durch "BM" (=BitMap) belegt. 4216 = 6610 ist der ASCII-Wert von B und 4D16 = 7710 ist der ASCII-Wert von M. Die nächsten 4 Byte geben Auskunft über die Dateilänge. Das geht so 5E 04 ist die Hexadezimalzahl 045E16 = 4.162 + 5.161 + 14.160 = 1118. Man muss also die beiden Bytes 5E und 04 vor dem zusammenhängen vertauschen. Schließlich dienen die letzten 4 Bytes die Position anzugeben, ab der die Pixelinformationen stehen.
 
Header 2 Im zweiten Header (dunkelgrau unterlegt) stehen Informationen über Bildmaße und Farbtiefe. Die Größe dieses Header ist variabel. An erster Stelle des zweiten Headers steht seine Länge, in unserem Fall 40 Bytes, gefolgt über die Bildbreite und Bildhöhe in Pixel, usw.
Farbpalette Im gelb unterlegten Teil des Headers werden die im Bild benutzten Farben indiziert. Das geschieht allerdings nur, wenn das Bild eine geringere Farbtiefe hat als 15 Bit. Jeder Eintrag in diese sog. Farbpalette belegt dann grundsätzlich 4 Byte = 32 bit. Der Wert im ersten Byte legt die Intensität von Blau, das zweite die Intensität von Grün und das dritte die von Rot (umgekehrt: RGB). das letzte Byte bleibt frei, um den Zugriff von 32 Bit-Programmen  (32 Bit = 4Byte) zu optimieren.
Pixel In unserem Beispiel beginnt die Beschreibung der Pixel ab der Adresse 107810. Es ist das linke untere Pixel des Bildes und soll die Farbe C2 haben. Dabei ist C216 der Index der Farbe, welche Farbe es tatsächlich ist steht in der Farbpalette. Aus der Information aus dem Header weiß das Programm, wann die Zeile zu Ende ist, nämlich nach 6 Pixel. Es folgen die Pixel für den Aufbau der 2.letzten Zeile (= 4. Pixelzeile). Man erkennt an der Position (Offset) 108810den Eintrag FF16 = 25510. In der Farbtabelle steht beim Index 255 die Farbe FF FF FF , also volle Farbtiefen für Blau, Gelb und Rot, was auf dem Bildschirm die Farbe weiß ergibt. An dieser Stelle kann man sehr schön erkennen, wie die Indizierung Platz spart.
 
BMP-Datei
Offset (dez) Daten (hex) Bedeutung
0000 42 4D Datei-Identifikation ("BM")
0002 5E 04 00 00 Dateilänge (1118 Bytes)
0006 00 00 00 00 Reserviert
0010 36 04 00 00 Zeiger auf Pixeldaten (Offset 1078)
0014 28 00 00 00 Headergröße (40 = 2816 Bytes)
0018 06 00 00 00 Bildbreite (6 Pixel)
0022 05 00 00 00 Bildhöhe (5 Pixel)
0026 01 00 Anzahl Ebenen (1)
0028 08 00 Bits pro Pixel (8)
0030 00 00 00 00 Kompression (0, unkomprimiert)
0034 28 00 00 00 Größe der Pixeldaten (40 Bytes)
0038 C4 0E 00 00 X-Auflösung (75 dpi)
0042 C4 0E 00 00 Y-Auflösung (75 dpi)
0046 00 00 00 00 Anzahl genutzter Farben (ignoriert)
0050 00 00 00 00 Anzahl wichtiger Farben (ignoriert)
0054 00 00 00 00 Farbe 0 (schwarz)
0058 00 00 80 00 Farbe 1 (mittleres rot)
0062 00 80 00 00 Farbe 2 (mittleres grün)
... ... ...
1074 FF FF FF 00 Farbe 255 (weiß)
1078 C2 C2 C2 C2 C2 C2 00 00 Unterste = 5. Pixelzeile
1086 C2 00 FF 00 FF C2 00 00 4. Pixelzeile
1092 C2 FF 00 FF 00 C2 00 00 3. Pixelzeile
1100 C2 00 FF 00 FF C2 00 00 2. Pixelzeile
1008 C2 C2 C2 C2 C2 C2 00 00 1. Pixelzeile
 
Unsere Daten in der bmp-Datei (in der Tabelle kursiv dargestellt) liefern ein Bild, das stark vergrößert diese Gestalt hat:
  Jetzt verstehen wir auch, warum wir mit dem Überschreiben beim Verstecken erst 'spät' in der Datei beginnen, wir müssen nämlich sicherstellen, dass wir die Header und die Farbpalette nicht zerstören, wir wollen ja nur einzelne Pixel überschreiben. Unsere Methode verstecken, könnte natürlich aus der Datei die Information auslesen, ab welcher Stelle die Pixeleinträge beginnen, der Aufwand ist für unseren Zweck aber zu groß. So könnte man die 'Länge' der Pixeldaten ermitteln. Mit der Länge des Textes kann man dann den Text gleichmäßig über das Bild verteilen. Kennt man die Länge des versteckten Textes, so kann man diesen aus dem Bild mit dem versteckten Text, diesen wieder auslesen. Die Länge des Textes übernimmt dann die Rolle des Schlüssels.
Verehrter Leser, wollen Sie es versuchen? Die Lösung wird dann hier veröffentlicht.
   
   
Notiz: Die Anregung für diese Seite und das Pixel-Bild stammen von "Daniel's Homepage" mit der URL:
http://www.fh-wedel.de/~bek/c/praktika/seminar-iass02.html#gif
 
zu 25.12 Übungen
zur Startseite www.pohlig.de  (C) MPohlig 2005