Professor Dr. F. Schweiggert Abteilung Angewandte Informationsverarbeitung 29. Januar 2001
Johannes MayerBlatt 12


[c]



Allg. Informatik für WiWi (WS 2000/2001)


Abgabetermin: 8. Februar 2001

1 Arbeiten mit Bildern (30 Punkte)

Sie dürfen nun etwas ganz anschauliches machen. Sie bekommen Schwarz-Weiss-Bilder im PBM-Format und sollen diese einlesen, verändern und ausgeben. Das Schöne an dieser Aufgabe ist, dass sie sich die Programm-Ausgabe als Bild betrachten können.

Zunächst ein paar Worte zum PBM-Format. (Wir betrachten hier nur die ASCII-Version, d.h. sie können davon ausgehen, dass es sich bei dem Bild um eine Textdatei handelt.) Das Bild beginnt mit der typischen Zeichenkette ,,P1``. Danach folgen ein (oder mehrere) Whitespace(s), d.h. Leerzeichen, Tabulatoren oder Zeilenumbrüche. Danach kommen die Breite des Bildes, Whitespaces, die Höhe des Bildes und wieder Whitespaces. Danach kommt für jeden Punkt des Bildes genau eine Zahl (0 oder 1), wobei zunächst die Punkte der ersten Zeile von links nach rechts, dann die der zweiten und so weiter kommen und die Zahlen durch Whitespace(s) voneinander getrennt sind. Die 1 repräsentiert dabei einen schwarzen und die 0 einen weissen Punkt. Sie können davon ausgehen, dass die Bilder genau so aufgebaut sind und die Anzahl der Punkte gleich Höhe mal Breite ist. Zudem sollte jede Zeile höchstens 70 Zeichen enthalten, was sie bei der Ausgabe beachten müssen. (Für weitere Informationen siehe man pbm.) Beispiel:

P1
5 5
0 1 1 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 0 0
1 1 1 1 1

Zur internen Verwaltung eines Bildes ist ihnen die folgende Datenstruktur vorgegeben:

CONST MAXWIDTH = 1000;
      MAXHEIGHT = 800;

TYPE PBMImage = RECORD
                   width, height : INTEGER;
                   pixel : ARRAY MAXWIDTH, MAXHEIGHT OF BOOLEAN;
                END;
Wir gehen also davon aus, dass ein Bild nicht größer als 1000 mal 800 ist. Im Feld width ist die Breite und in height die Höhe des Bildes in Pixeln enthalten. Das Array pixel enthält für jeden Punkt des Bildes einen Eintrag. Ein schwarzer Punkt soll in diesem Array als Wert TRUE abgespeichert werden (somit repräsentiert also FALSE einen weissen Punkt).

Schreiben sie nun ein Oberon-Programm mit den im folgenden beschriebenen Prozeduren. Zuächst wollen wir von der Standardeingabe ein Bild im PBM-Format einlesen. Dazu schreiben wir die Prozedur

PROCEDURE ReadPBM(VAR image: PBMImage);
die dann das eingelesene Bild im VAR-Parameter image zurückgibt. Außerdem benötigen wir zur Ausgabe von image auf die Standardausgabe die folgende Prozedur:
PROCEDURE WritePBM(image: PBMImage);
Jetzt möchten wir natürlich auch am Bild etwas verändern. Also schreiben wir die Prozedur
PROCEDURE InvertPBM(VAR image: PBMImage);
mit der die Farben im Bild vertauscht werden (aus einem schwarzen Punkt wird ein weisser und umgekehrt). Zu guter Letzt möchten wir das Bild noch horizontal spiegeln (d.h. erste und letzte Zeile vertauschen, zweite und vorletzte Zeile vertauschen, ..., aber nur bis zur Mitte). Dazu schreiben wir folgende Prozedur:
PROCEDURE HReflectPBM(VAR image: PBMImage);

Im Hauptprogramm sollen alle Prozeduren, die Sie geschrieben haben, verwendet werden. Testen können Sie Ihr Programm mit den Bildern unilogo.pbm, trophy.pbm und 2dimnor.pbm.

(Hinweise: Angenommen Ihr Programm heißt PBM, dann können sie mit der Kommandozeile PBM < trophy.pbm | xv - die Ausgabe Ihres Programms mit dem Programm xv als Bild betrachten. Beim PBM-Format sind auch Kommentarzeilen, die mit # beginnen, zugelassen. Diese ignorieren wir hier der Einfachheit halber.)





Viel Erfolg!


Johannes Mayer, 2001-01-29