Bildbearbeitung auf der Kommandozeile
 
Wichtigste Befehle zusammengefasst

# identify sample.jpg
gibt Informationen über das Bild aus.

# convert -geometry x600 -sharpen 1 -quality 90 bild1.bmp bild1.jpg
Skaliert ein BMP-Bild auf die Höhe 600 Pixel, zeichnet es scharf und speichert es mit JPG-Qualitätsstufe 90 im Format JPG.

# mogrify -geometry x600 -sharpen 1 -quality 90 -format jpg *.bmp
wie vorheriger Befehl nur für ein ganzes Verzeichnis voller BMP-Bilder.

# convert -rotate 90 -quality 90 input.jpg output.jpg
dreht ein JPG-Bild um 90 Grad und speichert es in Qualitätsstufe 90.

# montage -geometry 900x600+2+2 -tile 6x4 *.jpg montage.jpg
erstellt aus einem Verzeichnis voller Bilder eine gekachelte Ansicht der Bilder mit jeweils 6 Bildern pro Zeile nebeinander und 4 Zeilen maximal. Dabei wird mit geometry die Größe der Bilder festgelegt und mit +2+2 ein 2 Pixel großer Rahmen um die Bilder gezogen.

# animate -delay 200 *.jpg
läßt eine Dia-Show aller JPG-Dateien im Verzeichnis ablaufen mit 2 Sekunden zwischen den Bildern.

# display bild.jpg
zeigt das Bild im Fenster an und mit einem Mausklick kann man ein Menü mit Bearbeitungs-Funktionen öffnen. Sozusagen Bildbearbeitung für Maus-Schubser.

 

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