Bildersturm
Wer Fotos vor der Webveröffentlichung bearbeiten oder nur Ausschnitte bringen will, dem steht jede Menge Software zur Verfügung. Dazu zählt ImageMagick, das sich unter anderem zur Batch-Verarbeitung eignet.
- Henning Behme
Bilder ins Web zu stellen, ist mittlerweile eine Volkssportart. Michael Riepe hat schon in iX 7/07 gezeigt, welche Hilfe die netpbm-Tools dabei sein können. Das ImageMagick-Paket bietet mit mehreren Teilprogrammen (convert, montage, ...) ebenfalls Unterstützung auf der Kommandozeile - etwa für Batch-Verarbeitung. Hier sei ein Shellskript vorgestellt, das eine JPEG-Datei in eine im Prinzip beliebige Anzahl von Kacheln zerteilt.
Um ein Bild modifizieren zu können, muss der Bearbeiter ein Programm zur Verfügung haben, das „weiß“, welches Format das ihm übergebene Bild hat und wie viele Kacheln als Ergebnis herauskommen sollen. Deshalb erhält das nebenstehende tileimg zunächst Parameter, die es Variablen zuweist, wobei die vierte optional ist - nur erforderlich, wenn es sich nicht um JPEG-Daten handelt (djpeg soll zwar nur JPG auspacken, aber ein Versuch mit PNG zeigte dasselbe Ergebnis).
Ein Aufruf von djpeg und die Umleitung seiner Ausgabe nach sed bewirken, dass die Shellskriptfunktion geometrie aus dem Originalbild zunächst die Breite und Höhe übergeben bekommt. Die sed-Optionen -ne bedeuten „Input-Zeile nicht ausgeben“ (n) und „folgendes Kommando ausführen“ (e). 2p veranlasst sed, die zweite Zeile auszugeben.
Zwei Schleifen, sie alle zu kacheln
Was das Skript außerdem „wissen“ muss: in wie viele Streifen die Vorlage waagerecht und senkrecht aufzuteilen ist. BSTREIFEN=$(((BREITE + BANZAHL - 1)/BANZAHL)) hat zum Ergebnis eine ganze Zahl, die nicht kleiner ist als der Quotient aus BREITE und BANZAHL. Analoges gilt für HSTREIFEN.
mogrify, Bestandteil des ImageMagick-Pakets, beschneidet Bilddateien. Aus einem Bild der Größe 1229x922 etwa ergäbe
mogrify -crop 410x308+410+308 datei
bei drei Kacheln in Höhe und Breite die mittlere (= zweite der zweiten Reihe).
Zwei Arbeitsschritte muss tileimg ausfĂĽhren, damit nach dem Programmlauf alle Kacheln erzeugt sind. Im ersten transformiert das Skript Kopien der Originaldatei in drei senkrechte Balken von der errechneten Breite. Im zweiten Schritt, jeweils Bestandteil des ersten, geht es darum, aus dem gerade erstellten Balken drei in der Senkrechten geteilte Kacheln zu extrahieren.
Zwei while-Schleifen setzen das um. Die äußere kopiert in jedem Durchlauf (solange X kleiner als die Gesamtbreite ist) das Original in die Streifen-Datei, um Letztere anschließend mit mogrify zu modifizieren. Die Option crop bewirkt gleichsam ein Ausschneiden des angegebenen Bildteils, wie oben zu sehen.
Innerhalb dieses Durchgangs, wenn mogrify aus der Gesamtkopie einen Balken transformiert hat, kopiert das Skript ihn in der inneren while-Schleife in die Datei, die die jeweilige Kachel enthalten soll und wendet erneut mogrify an (solange Y kleiner als die Bildhöhe ist). Wichtig: In der inneren Schleife muss der X-Offset immer den Wert 0 haben, während er in der äußeren nach jedem Durchlauf erhöht wird. Analog gilt für Y, dass es am Ende der äußeren Schleife wieder auf 0 zu setzen ist, damit die beim nächsten Durchgang wieder den Ausgangswert vorfindet. Was im Listing fehlt ist, überflüssige Dateien zu löschen.
Dem Webauteur nicht zu schweur
Was das nebenstehende Skript nicht leistet: die Generierung des erforderlichen HTML-Codes. Da müssen Webautoren ran und per div, p oder table die gewünschten Kacheln mit dem gewünschten Stil (visibility: hidden/visible) versehen, den man wiederum per Javascript beim Mouseover oder dergleichen verändern kann.
Für diejenigen, die die notwendigen Tools nicht auf ihrem Rechner haben, steht ImageMagick unter www.imagemagick.org für diverse Systeme zum Download bereit. djpeg und sed sind auf Linux-Systemen und Mac OS X vorhandene Unix-Werkzeuge, die unter Umständen per apt-get oder einem ähnlichen Kommando nachzuinstallieren sind.
Mitarbeit am Skript: Michael Riepe
Listing 1: tileimg
#!/bin/bash
FILE=$1
BANZAHL=${2:-1}
HANZAHL=${3:-1}
FORMAT=${4:-jpg}
geometrie() {
BREITE=$1
HOEHE=$2
}
### Bildbreite und -hoehe eruieren
geometrie `djpeg -pnm ${FILE}.${FORMAT} | sed -ne 2p`
### Variablen initialisieren
X=0
Y=0
i=1
BSTREIFEN=$(((BREITE + BANZAHL-1) / BANZAHL))
HSTREIFEN=$(((HOEHE + HANZAHL-1) / HANZAHL))
### Aeussere und innere Schleife fuer Kacheln
while [ $X -lt $BREITE ]
do
cp $FILE.$FORMAT $FILE$i.$FORMAT
mogrify -crop ${BSTREIFEN}x${HOEHE}+${X}+${Y} $FILE$i.$FORMAT
j=1
while [ $Y -lt $HOEHE ]
do
cp $FILE$i.$FORMAT $FILE$i$j.$FORMAT
mogrify -crop ${BSTREIFEN}x${HSTREIFEN}+0+${Y} $FILE$i$j.$FORMAT
Y=$((Y+HSTREIFEN))
j=$((j+1))
done
X=$((X+BSTREIFEN))
i=$((i+1))
Y=0
done
(hb)