4 Pixelgraphik

Zum vorigen Kapitel Zum Inhaltsverzeichnis Zum nächsten Kapitel


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 zeigt das OKEN-Logo. Das Bild besteht aus 146 Zeilen zu jeweils 103 Pixeln, die hier aber nur die zwei Werte "schwarz" und "weiß" annehmen können. Erst in entsprechender Vergrößerung "sieht" man die Pixel (--hier wird nur ein Ausschnitt des Bildes gezeigt; erkennen Sie ihn?--) :

Oken_pix2.png


Die in der Praxis verwendeten BitMap-Formate sind leider allesamt so kompliziert aufgebaut, dass deren konkretes Studium sehr mühsam ist. Sie sollen 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.


Aufgaben:
  1. Suchen Sie im Programm-Verzeichnis von "Delphi" nach der Datei "Imagedit.exe" und starten Sie diese. Erzeugen Sie eine neue Bitmap mit 2 Farben, einer Zeilenzahl zwischen 7 und 10, mit gleichlangen Zeilen einer beliebigen, aber festen Länge zwischen 14 und 18 Pixeln. Stellen Sie die Bitmap stark vergrößert auf dem Bildschirm dar, und schalten Sie die Anzeige eines Rasters ein, damit Sie die Pixel deutlich sehen können.
    Fertigen Sie dann eine Zeichnung an, indem Sie einzelne Pixel setzen oder auch die anderen angebotenen "ImagEdit"-Werkzeuge benutzen. Speichern Sie die fertige Zeichnung unter dem Namen "graph1.bmp" auf Ihrem privaten Laufwerk ab.


  2. Diese Ihre 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 Sie dürfen ihm keine Zusatzinformationen mündlich geben.

    2. Der Empfänger erhält von Ihnen 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 Ihre 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.
      Achten Sie 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. Geben Sie Ihre Bild-Daten mitsamt der Anleitung an Ihren Nachbarn, der Ihnen seinerseits seine Werke überlassen soll. Lesen Sie sich genau die Dekodierungs-Anleitung Ihres Nachbarn durch. Das Ziel ist, dass Sie aus den Daten sein Bild wiederherstellen. Erzeugen Sie dazu mit "ImagEdit" eine passende leere Bitmap, und füllen Sie sie gemäß den übergebenen Bilddaten mit weißen und schwarzen Pixeln. Speichern Sie das Ergebnis unter dem Namen "Graph2.bmp" auf Ihrem privaten Laufwerk.


  4. Vergleichen Sie die rekonstruierten Bilder mit den Originalen! War die Datenübertragung erfolgreich?
    Wenn es Fehler gab, überlegen Sie sich, wie man diese in Zukunft vermeiden kann! Bessern Sie in diesem Falle Ihre Kodierungsmethode bzw. die Dekodierungs-Anleitung nach!
    Ist Ihre Kodierungsmethode schließlich ausgereift, schreiben Sie bitte auf beide Blätter Ihren Namen und geben Sie 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 muss 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.

Wir betrachten zum Schluß als kleines Beispiel 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

Beachten Sie, 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!



Aufgaben:
  1. Überlegen Sie sich, 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 Bits zu einem Byte zusammenfassen und dann diese Byte-Folge in die Datei schreiben.
    Stellen Sie die obigen Bilddaten als hex-kodierte Byte-Folge dar. Um welchen Faktor wird durch diese Maßnahme die Bilddatei verkürzt?




Zum vorigen Kapitel Zum Inhaltsverzeichnis Zum nächsten Kapitel