
Monochrome Bitmaps
« | 29 Oct 2023 | »Die ersten Bilder, die ich Mitte der 90er auf Disketten speicherte mussten klein sein. 24-bit Bitmaps waren ein No-Go, weil viel zu groß. 16 Farben mit 4-Bits war aber gerade noch möglich und daher quasi ein Standard.
Und als ich heute mit meiner Eigenimplementierung Probleme feststellte, lag es an einem noch älteren “besseren” Format, nämlich 1-Bit Schwarz-Weiß Bitmaps.
Windows 95 Setup lädt
bei der Installation ein blaues Hintergrundbild mit einer den Schirm
füllenden Tastatur in den Speicher und eben dieses Bild existiert auch weiter
in c:\\Windows
.
Als ich die Datei mit meinem eigenen Bildbetrachter öffnen wollte, startete
eine längere Debugging Session.
Denn das “blaue” Windows-95 Setup-Bild ist nämlich eine Schwarz/weiß-Grafik.
Oder besser gesagt eine 1-Bit Grafik mit einer Farbpalette für die Farben
Schwarz und Blau. Das ganze wurde so
hinge-dither-t,
dass es wie ein Farbverlauf aussieht aber keiner ist.
Und wenn in einem Byte 8 Pixel gespeichert werden können, verringert sich
die sonst unkomprimierte Bildgröße auf ein viertel von dem, was eine 4-Bit
16-Farben Grafik brauchen würde.
Mein erstes Problem war, dass ich in meinem Code gar nicht auf die richtige Implementierung umleitete, wenn “1” Bit pro Pixel im Header vermerkt war … denn solche Bilder gibt es heute überhaupt nicht mehr.
Doch dieser Bug war schnell behoben, und erst dann wurde zum ersten Mal sichtbar, dass meine Mono-Bitmap-Implementierung schon immer falsch waren.
Ich ging nämlich davon aus, dass das erste (niederste) Bit im Pixel-Byte auch gleich dem ersten Pixel selbst entsprach. Doch es ist genau umgekehrt: Das höherwertige Bit entspricht dem 1. Pixel, und würde etwa so adressiert werden:
Ich hatte leider nur ein x % 8
anstatt von das 7 - (x % 8)
im Code.
Fazit
Nun gut, wieder wurde ein kleiner Bug gefixt, und ich habe gelernt, wie Schwarz/Weiß Grafiken in der Regel im Speicher ausgerichtet sind.
Tatsächlich sind solche Formate ein wahrere Segen, wenn man wenig Speicher zur Verfügung hat. Echte Kompression würde oft auch noch mehr Speicher sparen doch am Ende muss immer alles einmal im RAM stehen, das wäre dann bei 640x480 Pixel:
- 24-Bit Bitmap: 921600 Bytes
- 8-Bit Bitmap: 307200 Bytes
- 4-Bit Bitmap: 153600 Bytes
- 1-Bit Bitmaps: 38400 Bytes
Man sieht also, wie viel Platz man verschwendet, wenn man nur 2 echte benutzte Farben auf 24-Bit aufblähen würde.