Auf Kommando animiert
Netpbm-Tools und Shell-Skripte
Filter in Ketten
Die folgenden Arbeitsschritte verfremden das Testbild mit einigen Filterkommandos. Zuerst wandelt folgender Befehl das Bild in Graustufen:
ppmtopgm glass.ppm > glass.pgm
Wie jeder andere Filter aus dem Netpbm-Paket schreibt ppmtopgm das Ergebnis auf die Standardausgabe, die wir mit dem Größer-als-Zeichen > in eine neue Datei glass.pgm umleiten. Das Ergebnis zeigt Abbildung 2.
Um für weitere Filterschritte unnötige Temporärdateien zu vermeiden, nutzen wir nun aus, dass die Netpbm-Programme von der Standardeingabe lesen können. Damit ist es möglich, mehrere Filter mit Pipes in der Shell hintereinander zu schalten:
ppmtopgm glass.ppm | pgmoil -n 5 | pgmtoppm Blue-White > oil.pgm
Die Ausgabe von ppmtopgm wird dabei direkt an pgmoil weiter gereicht. Dieser Filter versieht das Bild mit einem Effekt, der die Konturen wie in einem Ölbild verlaufen lässt. Die pgmoil-Option -n 5 teilt dem Filter mit, den Öl-Effekt auf Felder von je 5 mal 5 Pixeln anzuwenden.
Um wieder Farbe ins Bild zu bringen, reiht sich ein weiterer Filter (pgmtoppm) in die Kette ein, der die Graustufen auf einen Blau-Weiß-Verlauf abbildet. Das Resultat sehen Sie in Abbildung 3.
Laufen lernen
Einzelne Filter von der Kommandozeile aus aufzurufen ist zwar ganz nett, doch viele Stärken der Kommandozeilentools nutzen erst Shell-Skripte richtig aus. Damit können Sie in einem Rutsch ganze Sammlungen von Bilddateien durch die gleiche Filterkette schicken oder einfach nur in ein anderes Format bringen.
Doch woher die Bilderflut nehmen? Auch hier hilft Povray mit dem bereits angesprochenen Animationsfeature. Mit dem Kommando
povray +i glass.pov +w240 +h180 +fp +a0.1 +kfi00 +kff49 +kc
bringen Sie den Raytracer dazu, eine Animationssequenz von 50 Bildern zu berechnen. Die Bilddateien heißen glass00.ppm, glass01.ppm bis glass49.ppm. Entsprechend stehen die Optionen +kfi und +kff für die Nummern des ersten bzw. letzten Bildes. Die Option +kc zeigt an, dass es sich um eine zyklisch wiederholte Animation handelt.
Nun soll aus den Einzelbildern ein animiertes GIF-Bild zum Einbau in eine Web-Seite entstehen. Damit die GIF-Datei nicht zu groß wird, bietet sich eine Verkleinerung der Bildabmessungen auf 100 mal 75 Pixel an. Das Shell-Skript mkgifanim (Listing 2) bewältigt diese Aufgabe und ruft abschließend das Tool whirlgif auf, das die GIF-Einzelbilder zum animierten GIF zusammenklebt.
Listing 2
mkgifanim
#!/bin/bash
for f in glass??.ppm
do
pnmscale -w 100 $f | ppmquant 256 | ppmtogif > ${f%.ppm}.gif
done
whirlgif -o g_anim.gif -loop -time 8 glass??.gif
In der for-Schleife durchläuft die Variable f alle Dateinamen, die auf das Shell-Muster (siehe Kasten 1) glass??.ppm passen. In der Filterkette skaliert pnmscale das jeweilige Bild auf 100 Pixel Breite. Die Höhe wird entsprechend dem Seitenverhältnis mitskaliert. Den nächsten Schritt besorgt ppmquant, das die Farbanzahl auf die für GIF maximalen 256 Farben reduziert. Schließlich schreibt ppmtogif das eigentliche GIF-Bild. Den neuen Dateinamen konstruiert das Skript dabei aus dem aktuellen Inhalt der Variable f, wobei es .ppm als Endung abschneidet und .gif als neue Endung anhängt. Der nachfolgende whirlgif-Aufruf erzeugt die Animation g_anim.gif, die durch die Option -loop endlos wiederholt wird und durch -time 8 zwischen den Bildern 8 Millisekunden Pause lässt. In Abbildung 4 sehen Sie die Animation, wenn Sie dieses Heft mit Daumenkino-Plugin gekauft haben. Im Ernst: Die Datei befindet sich auch auf der Heft-CD und lässt sich in einem Web-Browser oder xanim betrachten.
Kasten 1: Shell-Muster
Die Shell kennt bestimmte Muster für Datei- und Verzeichnisnamen, die sie vor dem Aufruf des entsprechenden Kommandos expandiert. Die wichtigsten sind
- das Fragezeichen
?. Es steht für genau ein beliebiges Zeichen. - der Stern
*. Er dient als Joker für beliebig viele (auch null) beliebige Zeichen. - Zeichenaufzählungen in eckigen Klammern
[]. An der entsprechenden Stelle muss genau eines der umklammerten Zeichen stehen. Dabei gibt es verschiedene Schreibweisen, die die folgenden Beispielen verdeutlichen: Das Musterlx[acE].txtpasst auf die Namenlxa.txt,lxc.txtundlxE.txt. graph[a-z][0-9][0-9].jp?passt (unter anderem) auf die Namengraphi50.jpg,grapho01.jpgundgraphx55.jpe. Der Bindestrich innerhalb der eckigen Klammern sorgt dafür, dass ein ganzer Zeichenbereich gemeint ist, also alle Kleinbuchstaben vonabiszbzw. alle Ziffern von0bis9.
Das Muster [^abc][xyz].b* passt (unter anderem) auf wy.b und 3x.ball, aber nicht auf cz.bmg oder rx.img. Das Dach ^ nach der einführenden Klammer steht für Negation, gemeint sind also alle Zeichen außer den nachfolgend aufgelisteten.



