Monochrome Bitmaps

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:

1unsigned char* line_bytes;
2for(x = 0; x < width; ++x)
3{
4  pixel_bit = line_bytes[x / 8] & 1 << (7 - (x % 8));
5}

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.

📧 📋 🐘 | 🔔
 

Meine Dokus über:
 
Weitere externe Links zu:
Alle extern verlinkten Webseiten stehen nicht in Zusammenhang mit opengate.at.
Für deren Inhalt wird keine Haftung übernommen.



Wenn sich eine triviale Erkenntnis mit Dummheit in der Interpretation paart, dann gibt es in der Regel Kollateralschäden in der Anwendung.
frei zitiert nach A. Van der Bellen
... also dann paaren wir mal eine komplexe Erkenntnis mit Klugheit in der Interpretation!