Index

4. Kodieren von Daten (2)

Bildformate


Pixel   Vektor   Übung  

1. Das Pixel-Format

Um ein Bild in digitaler Form darzustellen, kann man es mit einem Raster überziehen und so in einzelne kleine "Pixel" (von "Picture element", meist quadratisch) zerlegen. Jedes Pixel erhält genau einen Farbwert zugeordnet, womit das Gesamtbild also durch eine Menge von kleinen, einfarbigen Flächen dargestellt wird. Da die Farbwerte der einzelnen Pixel in einer zugehörigen Bild-Datei durch entsprechende Bitmuster repräsentiert werden, nennt man eine solche Darstellung eine "BitMap".

Oken_sw.png

Ist die Rasterung fein genug und stehen hinreichend viele verschiedene Farbwerte zur Verfügung, dann nimmt das Auge das Rasterbild in derselben Weise wahr, wie das Original. Das nebenstehende Schwarz-Weiß-Bild besteht aus 146 Zeilen zu jeweils 103 Pixeln, die hier aber nur die zwei Werte "schwarz" und "weiß" annehmen können.


Oken_pix2.png

Erst in entsprechender Vergrößerung "sieht" man die Pixel (hier wird nur ein Ausschnitt des Bildes gezeigt; erkennst du ihn?)

Die in der Praxis verwendeten BitMap-Formate sind leider allesamt so kompliziert aufgebaut, dass deren konkretes Studium sehr mühsam ist. Wir wollen stattdessen ein eigenes einfaches Format zur Darstellung von Pixelbildern entwerfen, wobei wir uns zunächst auf die Kodierung von Schwarz-Weiß-Bildern beschränken. Solche Bilder lassen sich leicht mit dem Programm "ImagEdit" herstellen, das zum "Delphi"-Paket gehört.
Das Ziel der folgenden Aufgabe ist es, ein Verfahren zu finden, mit dem beliebige Schwarzweißbilder digital kodiert und dekodiert werden können, ohne dass dabei andere Zeichen als Nullen ("0") und Einsen ("1") verwendet werden.

Aufgabe

  1. Starte das Programm "Imagedit.exe". Erzeuge eine neue Bitmap mit 2 Farben, einer Zeilenzahl zwischen 7 und 10 und mit gleichlangen Zeilen einer beliebigen, aber festen Länge zwischen 14 und 18 Pixeln. Stelle die Bitmap stark vergrößert auf dem Bildschirm dar, und schalte die Anzeige eines Rasters ein, damit du die Pixel deutlich sehen kannst.
    Fertige dann eine Zeichnung an, indem du einzelne Pixel setzt oder auch die anderen angebotenen "ImagEdit"-Werkzeuge benutzt. Speichere die fertige Zeichnung unter dem Namen "graph1.bmp" im Homeverzeichnis ab.


  2. Diese Grafik soll nun an den Nachbar-Arbeitsplatz übermittelt werden. Dabei sollen folgende Spielregeln eingehalten werden:

    1. Der Empfänger muss alle Informationen schriftlich erhalten. Er darf keine Rückfragen stellen, und du darfst ihm keine Zusatzinformationen mündlich geben.

    2. Der Empfänger erhält von dir genau zwei DIN-A4-Blätter:
      1. Auf dem ersten Blatt soll eine einzige lange Reihe von Zeichen stehen, die ausschließlich Nullen ("0") und Einsen ("1") enthält. Diese "0/1"-Folge muss aber alle Informationen über die Graphik enthalten, also neben den Pixeldaten auch Angaben zur Größe! Wir legen nur fest, dass weiße Pixel durch "1" und schwarze Pixel durch "0" kodiert werden müssen.
      2. Das zweite Blatt enthält einen umgangssprachlichen Text, der möglichst exakt beschreibt, wie aus dem "0/1"-Bandwurm auf dem ersten Blatt das ursprüngliche Bild zu rekonstruieren ist.
      Achte streng darauf, dass das 2. Blatt auch für die Dekodierung eines anderen 1. Blattes taugt, auch wenn dieses die Daten einer Schwarz-Weiß-Graphik anderer Größe enthält. Es dürfen also keinerlei Daten des vorliegenden Bildes in der Anleitung auf dem 2. Blatt enthalten sein!

    3. Der Empfänger muss das Bild ausschließlich mit Hilfe der Daten dieser zwei Blätter rekonstruieren können.


  3. Gib deine Bild-Daten mitsamt der Anleitung an deinen Nachbarn, der dir seinerseits seine Werke überlassen soll. Lies dir genau die Dekodierungs-Anleitung deines Nachbarn durch. Das Ziel ist, dass du aus den Daten sein Bild wiederherstellst. Erzeuge dazu mit "ImagEdit" eine passende leere Bitmap, und füllen sie gemäß den übergebenen Bilddaten mit weißen und schwarzen Pixeln. Speichere das Ergebnis unter dem Namen "Graph2.bmp" im Homeverzeichnis.


  4. Vegleicht die rekonstruierten Bilder mit den Originalen! War die Datenübertragung erfolgreich?
    Wenn es Fehler gab, überlegt euch, wie man diese in Zukunft vermeiden kann! Bessert in diesem Falle eure Kodierungsmethode bzw. die Dekodierungs-Anleitung nach!
    Ist deine Kodierungsmethode schließlich ausgereift, schreibe bitte auf beide Blätter deinen Namen und gib sie dem Lehrer ab.




Es hat wenig Zweck, dem Empfänger bei der Bearbeitung der obigen Aufgabe lediglich die lange "0/1"-Folge auf dem ersten Blatt zu übergeben und zu sagen: "Das ist das Bild". Damit liegen ihm dann zwar die "Daten" vor, aber er kann ihnen noch keine "Information" entnehmen. Dies ermöglichen wir ihm erst, wenn wir ihm außerdem (nämlich auf dem zweiten Blatt!) mitteilen, wie die Daten zu interpretieren sind.

Ein mögliche Beschreibung der Bedeutung der Daten könnte folgendermaßen aussehen:

  1. Die ersten 32 Zeichen enthalten Angaben zu den Abmessungen des Bildes:
    1. Die ersten 16 Zeichen enthalten die Anzahl n der Pixel in jeder Zeile, und zwar als 16-stellige Dual-Zahl.
    2. Die nächsten 16 Zeichen enthalten die Anzahl m der Zeilen des Bildes, ebenfalls als 16-stellige Dual-Zahl.

  2. Dann folgen die Bilddaten:
    1. Das Bild ist zeilenweise kodiert, und zwar von oben nach unten, also mit der obersten Zeile beginnend.
    2. Jede Zeile ist Pixel für Pixel kodiert, und zwar von links nach rechts, also beginnend mit dem links außen stehenden Pixel.
    3. (Für jedes weiße Pixel ist eine "1" und für jedes schwarze eine "0" auf das Blatt geschrieben.)


Diese Beschreibung stellt offenbar eine für uns Mitteleuropäer recht naheliegende Organisation der Bilddaten dar. Wir durchlaufen das Bild von oben nach unten, und von links nach rechts, genau wie wir eine Textseite lesen. Dies ist aber durchaus nicht die einzige Möglichkeit, und Menschen mit einem anderen kulturellen Hintergrund könnten andere Daten-Organisationen als naheliegender empfinden:

Aber auch die Kodierung der Abmessungen des Bildes muß nicht notwendigerweise binär mit einer festen Stellenzahl geschehen. Andere Möglichkeiten wären z.B.:


Da es also offenbar keine für alle möglichen Adressaten in gleicher Weise naheliegende Organisation der Daten gibt, brauchen wir eine "Interpretationsanweisung", also eine Beschreibung, die uns zeigt, wie die Bildinformation in den Daten (ver)steckt (ist). Die obige Beschreibung ermöglicht sowohl die Kodierung des Pixelbildes in eine "0/1"-Folge als auch die Rekonstruktion des Bildes aus diesen Daten. Eine solche Beschreibung nennt man ein Datenformat.

Seitenanfang

2. Das Vektor-Format

Aufgabe:

Ganz anders arbeiten die sogenannten Vektor-Grafik-Formate, wie z.B. WMF ("Windows Meta File"), DXF (AutoCAD Drawing eXchange Format) oder EPS ("Encapsulated PostScript"). Bei diesen Formaten werden keine Bild-Inhalte, sondern Bild-Konstruktionsbeschreibungen abgespeichert. Man geht also nicht vom fertigen Bild aus, sondern protokolliert den Entstehungsprozess des Bildes. Dies muss so genau geschehen, dass die aufgezeichneten Daten später zur exakten Rekonstruktion des Bildes ausreichen.

Vektorgrafik hat den Vorteil, dass sie ohne Qualitätsverlust skalierbar ist, weil sie eben keine feste Pixel-Rasterung vorgeben muss. Allerdings sind nur solche Bilder für diese Formate geeignet, bei deren Entstehung eine Konstruktionsbeschreibung aufgezeichnet werden kann:
Wer ein eingescanntes Photo in eine Vektorgraphik umwandeln will, wird in den meisten Fällen keine befriedigenden Ergebnisse erzielen können.

Seitenanfang


Übungen:

Wir betrachten das folgende Pixelbild:

Smile_zoomed

Wenn man dieses Bild in dem oben beschriebenen Format kodiert, ergeben sich die folgenden Daten:

     0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
     1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
     0 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1
     0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1
     1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1
     0 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 1 0 1 1 0
     0 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1
     1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Beachte, dass die "weichen" Zeilenumbrüche nach 28 Zeichen hier ausschließlich der bequemeren Text-Darstellung der "0/1"-Folge dienen. Sie sind willkürlich gesetzt und tragen keine Informationen. Mithin gehören sie nicht zum Format!


  1. Überlege dir, warum das letzte Bild kein gutes "Testbild" ist, um die Korrektheit einer Datenübermittlung in diesem Format zu testen. Welcher Fehler könnte bei der Dekodierung gemacht werden, ohne dass er offenbar werden würde?

  2. Wenn man den obigen "0/1"-Bandwurm in eine Datei schreiben soll, könnte man natürlich für jedes Zeichen 1 Byte verwenden. Das wäre jedoch Verschwendung: Da ohnehin nur die Zeichen "0" und "1" auftreten können, genügt eigentlich 1 Bit für jedes Zeichen! Man wird also stets 8 aufeinanderfolgende Bit zu einem Byte zusammenfassen und dann diese Byte-Folge in die Datei schreiben.
    Stelle die obigen Bilddaten als hex-kodierte Byte-Folge dar. Um welchen Faktor wird durch diese Maßnahme die Bilddatei verkürzt?

Seitenanfang

[Index]


Autor: Roland Mechling
Überarbeitet: Jürgen Dehmer
Letzte Änderung: 18. November 2001