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!