Hier kommen wir zu einer der großen Stärken von Linux und der Kommandozeile.
Wo man bei Windows jedes Bild einzeln öffnen muß, wenn
man einen ganzen Ordner voll mit Bildern bearbeiten will, kann man
auf der Kommandozeile wiederkehrende Vorgänge automatisieren
und damit Bearbeitungsschritte nicht nur stark vereinfachen, sondern
auch ganze Ordner mit dutzenden von Bildern mit nur einem Befehl
in wenigen Sekunden umwandeln.
Die Befehle um unter Linux ganze Stapel von Bilderdateien in andere
Formate und Auflösungen zu konvertieren, heißen convert
und mogrify und stammen aus dem
"gm-GraphicsMagick command-line utilities to create, edit,
or convert images"-Paket.
Dabei ist die Vorgehensweise sehr einfach. Ein simpler Aufruf von
# convert bild1.bmp bild1.jpg
würde schon genügen, da convert die Art der Datei an der
Endung erkennt. Mit diesem Befehl wird ein BMP-Bild in ein
JPG-Bild komprimiert, mit der Standard-Qualitäts-Stufe
75 (0=höchste Kompression-schlechteste Qualität,
100=niedrigste Kompression, beste Qualität).
Genauer gehts mit
# convert -geometry x600 -quality 90 bild1.bmp bild1.jpg
Die Option geometry konvertiert das Bild immer im korrekten
Seitenverhältnis auf die angegebene Größe, daher
wird ein Bild in der Ausgangsgröße 320x200 mit -geometry 640x480
auf 640x400 skaliert. Als Alternativen für geometry kann man auch nur eine Größenangabe verwenden oder eine Prozentangabe, wie z.B. -geometry 200%. Möchte
man das Bild verzerren, muß ein Ausrufezeichen hinter die
Größenangabe gestellt werden, z.B. -geometry 640x400!.
Im obigen Beispiel wird das Bild auf eine Höhe von 600 Pixeln
mit einer Qualitätsstufe von 90 als jpg abgespeichert.
Ganze Ordner konvertieren
Will man ganze Ordner konvertieren, so geht das zwar auch mit
# for i in *.bmp; do convert "$i" "`basename "$i"
.bmp`".jpg; done
was aber sehr lang und umständlich ist, oder auch mit
# convert *.bmp Output%02d.jpg
was jedoch nicht gerade gut geeignet ist, da diese Variante eine
Numerierung von 00 beginnend, also 00,01,02,usw erzeugt und den
Dateinamen nicht übernimmt! Es muß ein neuer Name angegeben
werden. Im obigen Beispiel wären die Dateinamen Output00.jpg,
Output01.jpg, Output02.jpg, usw. Um ganze Verzeichnisse in einem
Rutsch umzuwandeln ist daher mogrify am Besten:
# mogrify -geometry x600 -quality 90 -format jpg *.bmp
wandelt ein ganzes Verzeichnis mit BMP-Bildern in JPG
um. Dabei bleiben die BMP-Bilder erhalten, da sich die Endung ja
von .bmp auf .jpg ändert.
Möchte man aus bestehenden jpg-Bildern thumbnails machen hilft
# mogrify -geometry 150x -quality 100 *.jpg
Achtung! Da die Ursprungs-Files schon die Endung .jpg
haben, werden die bestehenden JPG-Bilder damit überschrieben,
da mogrify lediglich die Endung austauscht, die Bilder aber nicht
umbenennt! Daher sollte man vorher eine Kopie der Bilder in einen
eigenen Ordner machen und dann erst mogrify darauf anwenden.
Informationen über Bilder
Es ist auch möglich
Informationen über Bilder einzuholen. Das geht mit identify:
# identify sample.jpg
Zeigt die Eckdaten der Bilddatei an. Ausführlicher gehts mit
# identify -verbose sample.jpg
Bilder drehen
Um Bilder zu drehen gibt es zwei verschiedene Möglichkeiten: verlustbehaftet und verlustfrei. Beide Varianten haben Vor- und Nachteile.
# convert -rotate 90 input.jpg output.jpg
Dreht ein Bild um 90 Grad im Uhrzeigersinn. Entgegen dem Uhrzeigersinn benutzt
man negative Werte. Vorteil dieses Befehls ist, daß bei Auflösungen die nicht durch 8 teilbar sind, trotzdem die volle Auflösung erhalten bleibt. Nachteilig ist die Neukompression des Bildes, welche mehr oder weniger verlustbehaftet ist. Um JPGs's verlustfrei zu drehen gibt es folgenden Befehl:
# jpegtran -rotate 90 input.jpg > output.jpg
Nachteil dieses Befehls ist, daß bei Auflösungen die nicht durch 8 teilbar sind, Teile des Bildes nicht gedreht werden können und somit abgeschnitten werden müssen. Die JPG-Kompression arbeitet immer mit 8x8 Pixelfeldern und wenn man eine Auflösung verwendet, die nicht durch 8 teilbar ist, können beim verlustfreien Drehen nicht alle Teile des Bildes gedreht werden. Ist das der Fall, bleibt an einem der Ränder eine kleine Leiste ungedrehter Pixel stehen, die natürlich nicht zum Rest des Bildes paßt. Daher sollte man die Option -trim nicht vergessen, welche bewirkt, daß die nicht drehbaren Teile abgeschnitten werden.
# jpegtran -rotate 90 -trim input.jpg > output.jpg
Bildschirmphotos
Um ein Bildschirmfoto eines Fensters zu machen:
# convert X: bild.bmp
erzeugt als Mauscursor ein Kreuz, mit dem man auf ein beliebiges
Fenster klickt, was dann als bmp-Datei abgespeichert wird. Das gleiche
macht auch
# import bild.bmp
Für den ganzen Desktop gibts
# xwd -root | convert - bildschirm.bmp
oder
# import -window root Desktop.bmp
Der Aufruf
# convert -display 192.168.1.2:0.0 X: output.bmp
funktioniert leider nicht, da der X-Server das aus Sicherheitsgründen unterbindet.
Konvertierungs-Befehle für Homepages
Fotografiert man mit einer hochauflösenden Kamera, haben die Bilder schon mal gut
und gerne 2300x1725 Pixel, was für die Homepage zum anschauen viel zu groß ist, da die Auflösung für Displays im Durchschnitt bei 1200x1024 Pixeln liegt. Noch ein zusätzlicher unangenehmer Nebeneffekt ist die große Datenmenge, was dazu führt, daß die unnötige Größe noch zusätzlich die Internet-Leitung belastet. Aus diesen Gründen werden Bilder für Homepages zum Anschauen kleiner gerechnet, ich nenne das hier mal in eine "Betrachtergröße", die für mich in etwa bei 600-800 horizontalen Pixeln liegt. Um große Bilder in die Größe zum Betrachten zu konvertieren gibt man folgenden Befehl ein:
# convert -geometry x600 -sharpen 1 -quality 90 bild1.bmp bild1.jpg
Das war für ein einzelnes Bild. Für ganze Verzeichnisse:
# mogrify -geometry x600 -sharpen 1 -quality 90 -format jpg *.bmp
Die Bilder werden hier auf eine Seitenhöhe von 600 Pixeln skaliert
und anschließend scharfgezeichnet. Das Scharfzeichnen ist
wichtig, da bei der Verkleinerung nicht einfach Pixel weggelassen
werden, sondern aus mehreren Pixeln ein neues Pixel gerechnet wird.
Man spricht dabei von Bikubischer Berechnung. Diese führt dazu,
daß das Bild bei der Verkleinerung unscharf wird. Mit Hilfe
der Option sharpen 1 wird das Bild wieder scharfgezeichnet.
Anschließend wird es im JPG-Format mit der Qualitätsstufe 90 gespeichert.
Möchte man für die Bilder eine thumbnail-Vorschau erstellen, kann man den gleichen
Befehl verwenden, z.B.
# convert -geometry x100 -sharpen 1 -quality 100 bild1.bmp bild1.jpg
für ganze Verzeichnisse:
# mogrify -geometry x100 -sharpen 1 -quality 100 -format jpg
*.bmp
Wie man sieht, wird hier die Qualitäts-Stufe 100 verwendet,
also höchste Qualität, was daran liegt, daß das
Bild so klein ist und damit so wenige Bildinformationen enthält.
Je mehr Bildinformationen, desto höher kann man komprimieren
ohne Artefakte zu sehen, daher bedeutet, je kleiner das Bild, desto
weniger sollte die Kompression sein, damit keine Artefakte entstehen.
Außerdem ist bei dieser Bildgröße die Dateigröße sowieso verschwindend gering.
Aus einem Verzeichnis mit Bildern eine HTML-Page
mit thumbnails automatisch erstellen lassen
convert ist selbst dazu in der Lage: Mit einem einfachen Befehl kann man aus einem Verzeichnis, das nur die fertigen Bilder zum Betrachten enthält, eine ganze
HTML-Seite mit verlinkten thumbnails erstellen:
# convert 'vid:*' HTML:index.php
Der Befehl ist in dem Verzeichnis in dem die Bilder liegen auszuführen.
Durch diesen Befehl werden 3 Dateien im Verzeichnis erstellt.
index.gif ist die Übersichtsgrafik der Bilder.
index.php ist eine HTML-Datei, welche die GIF-Grafik einbindet
und mit einer passenden Map-Definition ausstattet, so dass man per
Klick auf eines der Vorschaubilder zum großen Bild weiter
geleitet wird.
index_map.shtml enthält nur den Abschnitt der Map-Definition
aus index.php. Auf letztere Datei kann auch verzichtet werden.
Wer es ein wenig komfortabler und mit mehr Einstellungsmöglichkeiten haben will, verwendet mein selbstgeschriebenes Programm bildershow.
montage - mehrere Bilder zu einem großem Kacheln
Der Befehl montage generiert aus entweder einem ganzem Ordner oder einer angegebenen Anzahl Bilder ein neues Bild, das eine gekachelte Ansicht der ausgewählten
Bilder anzeigt. Dabei reicht schon eine simple Eingabe wie
# montage *.jpg montage.jpg
Ohne sonstige Angaben werden Standardeinstellungen verwendet und
die Bilder auf 120x80 Pixel geschrumpft und mit 128x126 Pixel großen
Kacheln nebeneinander gesetzt. Möchte man nur einzelne Bilder
auswählen, geht der Befehl so:
# montage bild1.jpg
bild2.jpg bild3.jpg montage.jpg
Gibt man nun Optionen an, beziehen sich diese immer auf das nächstfolgende
Bild, daher ist z.B. eine Größenangabe mit geometry
nicht irrelevant, wo sie steht.
Zwei Beispiele:
# montage -geometry 900x600 *.jpg montage.jpg
Hier werden die einzelnen Bilder auf eine Größe von 900x600
skaliert und die Größe des Montage-Bildes ergibt sich
aus der Anzahl der Bilder.
# montage *.jpg -geometry 900x600 montage.jpg
In diesem Beispiel wird das gekachelte Endbild auf die Größe
900x600 skaliert und die Größe der einzelnen Bilder errechnet
sich aus der Gesamtgröße des montage-Bildes.
Weitere Beispiele:
# montage -geometry 900x600+2+2 *.jpg montage.jpg
+2+2 gibt 2 Pixel links/rechts und 2 Pixel oben/unten hinzu.
Es entsteht also ein Rahmen von 2 Pixeln.
Mittels -tile wird die Anzahl der Bilder nebeneinander und
die Zeilen festgelegt, z.B.
# montage -tile 4x4 *.jpg montage.jpg
legt 4 Bilder nebeneinander fest und maximal 4 Zeilen. Hat man
bei diesem Beispiel mehr als 16 Bilder, werden mehrere Dateien angelegt:
montage.jpg.0, montage.jpg.1, montage.jpg.2, usw.
Mittels -label wird ein Bildtitel vergeben:
# montage -label "Titel 1" bild1.jpg -label "Titel
2" bild2.jpg montage.jpg
Auch die Hintergrundfarbe kann man angeben:
# montage -background <color> *.jpg montage.jpg
|