Kommandozeilenprogramme zur Bildbearbeitung punkten gegenüber den Tools mit grafischer Oberfläche durch einen entscheidenden Vorteil: Sie bieten vor allem beim Bearbeiten mehrerer Bilder deutlich mehr Flexibilität.
Sie kennen das sicher: Sie möchten die tollen Fotos von der letzten Linux-Veranstaltung unbedingt einem Bekannten schicken, also ab damit per Mail. Prompt erhalten sie die lästige Fehlermeldung, dass der Mailserver so große Anhänge nicht verarbeitet. Sie schicken sich also an, die Bilder zu verkleinern: Gimp aufrufen, im Menü Datei | öffnen das erste Bild laden, weiter ins Menü Bild | Bild skalieren, um das Bild genügend zu verkleinern, sodass der Mailserver es akzeptiert. Dieselbe Prozedur wiederholt sich für jedes einzelne Bild.
Auf der Kommandozeile
Wesentlich einfacher klappt das Ganze auf der Kommandozeile mithilfe von ImageMagick [1]. Praktisch alle Distributionen stellen das Tool in ihren Repositories bereit, sodass Sie es gegebenenfalls bequem über den Paketmanager nachinstallieren. Steht ImageMagick parat, dann setzen Sie einen Aufruf wie den folgenden ab:
$ convert -scale 50% bild.jpg small/bild.jpg
Er verkleinert das Bild bild.jpg in Höhe und Breite um 50 Prozent und schreibt das Ergebnis in die Datei bild.jpg im Unterverzeichnis small. Das mag für ein Bild noch umständlicher erscheinen, als dasselbe mit Gimp zu bewerkstelligen, aber mithilfe der Shell wenden Sie diesen Befehl sehr effizient auch auf viele Dateien an.
Üblicherweise liegen die Bilder in einem Verzeichnis und heißen dann beispielsweise bild001.jpg bis bild999.jpg. Um sie alle in einem Rutsch zu verkleinern, genügt eine kleine For-Schleife (Listing 1, erste Zeile). Nach wenigen Sekunden landen die verkleinerten Bilder im Verzeichnis small/. Weitere Informationen dazu finden Sie im Kasten “Multiplikator”.
Listing 1
$ for i in bild*.jpg ; do convert -scale 50% "$i" "small/$i.jpg"; done
$ find . -maxdepth 1 -name "bild*.jpg" -exec convert {} small/{} \;
$ find . -maxdepth 1 -name "bild*.jpg" | parallel convert {} small/{}
Multiplikator
Kommandozeilentools spielen ihre Stärken in Zusammenarbeit mit der Shell aus, die viele Dateien mit demselben Kommando automatisch hintereinander verarbeitet. Im einfachsten Fall nutzen Sie dazu eine For-Schleife, wie in der ersten Zeile von Listing 1. Die Shell expandiert die Wildcard in bild*.jpg in eine Liste aller Bilder (echo bild*.jpg zeigt das Zwischenergebnis an), die sie dann in der Schleife nacheinander verarbeitet. Die Anführungszeichen sorgen dafür, dass der Befehl auch Dateien mit Sonderzeichen im Namen, wie etwa Leerzeichen, problemlos konvertiert.
Bei sehr umfangreichen Bildbeständen, bei denen die Dateinamen hintereinander geschrieben mehr als 131?072 Zeichen umfassen, erscheint die Fehlermeldung Die Argumentliste ist zu lang. Solche Probleme umgehen Sie mit dem Find-Befehl aus der zweiten Zeile von Listing 1. Er sucht im aktuellen Verzeichnis (find .) ohne Unterverzeichnisse (-maxdepth 1) Dateien, auf die das Muster bild*.jpg passt, und führt dann für jede davon den Befehl convert {} small/{} aus. Die geschweiften Klammern dienen dabei quasi als Platzhalter für das aktuelle Bild, der Backslash als Endekennzeichnung. Diese Kombination konvertiert beliebig viele Dateien.
Beim Bearbeiten sehr vieler Bilder weisen jedoch beide vorgestellten Methoden einen Nachteil auf: Sie konvertieren die Grafiken der Reihe nach. Bei den heute üblichen Multi-Core-CPUs lasten diese Methoden also immer nur einen einzelnen Kern aus. Für Abhilfe sorgt die Software GNU Parallel (Listing 1, letzte Zeile). Unter Umständen müssen Sie das Paket gnu_parallel über die Paketverwaltung nachinstallieren. Die Software erhält die Liste der zu verarbeitenden Dateien via Pipe und lastet automatisch jeden Core mit einem Convert-Job aus. Vergleichen Sie dazu die Auslastung mittels top mit jener von den ersten beiden Methoden, wenn Sie eine lange Liste von Bildern verarbeiten. Weitere Informationen zu GNU Parallel finden Sie in einem Artikel aus LU 06/2013 [11].
Fotomontagen und Weboptimierung
Manchmal ist das beste Bild eine Kombination aus mehreren. Ob es sich dabei um die Gesichter der Familie vom letzten Ausflug handelt oder um Screenshots aus einem Film – eine Bildmontage bietet häufig eine schöne Zusammenfassung. Damit ImageMagick sie gut anordnet, sollten die Bilder alle etwa dieselbe Größe besitzen:
$ montage bild1.jpg bild2.jpg bild3.jpg bild4.jpg -geometry +2+2 montage.jpg
Diese Technik wendet unter anderem auch die Javascript-Bibliothek jQuery an: Statt Hunderte kleine Bilder einzeln als Icons zur Verfügung zu stellen, übermittelt sie diese dem Browser als einzelnes Bild und zeigt dann per CSS nur den jeweils relevanten Teil an. Dadurch genügt bereits eine einzige HTTP-Verbindung zum Server, sodass die Seite schneller lädt.
Oft erlauben Webseiten auch nur den Upload eines einzelnen Bilds etwa zu einem Artikel. Mithilfe von montage kombinieren Sie mehrere und umgehen damit die ärgerliche Beschränkung.
Fotos beschriften
Zwar sagt ein Bild bekanntlich mehr als tausend Worte, aber gelegentlich erweist es sich dennoch als hilfreich, ein Foto zu beschriften. Auch das klappt sehr einfach mit convert, das neben dem Konvertieren von einem ins andere Grafikformat noch viel mehr leistet. Sehen Sie sich dazu einmal das Beispiel aus Listing 2 an.
Listing 2
$ convert penguin_raw.png -gravity North \ -font /usr/share/fonts/truetype/LiberationSans-Regular.ttf \ -pointsize 100 -stroke '#0000A0' -strokewidth 5 \ -annotate 0 'Tux auf Tour' tux_auf_tour_simple.png
Der Schalter -gravity gibt an, wohin die “Schwerkraft” den Text zieht. Mit North wandert er nach oben, erscheint also am oberen Bildrand. Die möglichen Werte listet convert -list gravity auf. Hier finden sich auch Angaben für alle Ecken (SouthEast, …), der Parameter -gravity Center sorgt für zentrierten Text.
Die Option -annotate versieht dann das Bild mit dem gewünschten Text. Dabei verlangt es zunächst einen Zahlenwert, der den Drehwinkel angibt, anschließend folgt der Text. Mit \n fügen Sie darin Zeilenumbrüche ein. Neben der vollständigen Pfadangabe erlaubt die Software auch das Nennen des gewünschten Fontnamens; welche sie unterstützt, das zeigt in diesem Kontext die Ausgabe des Aufrufs convert -list font.
Diese Vorgehensweise erscheint zwar praktisch, das Ergebnis sieht aber langweilig aus. Glücklicherweise lassen sich fast beliebig viele Operationen miteinander kombinieren. Zum Beispiel zeichnet das Tool mit ein paar Tricks den Text in mehreren Farbabstufungen, in dem Sie die Konturfarbe in jedem Schritt ändern und die Konturdicke reduzieren. Listing 3 fasst den entsprechenden Aufruf zusammen; wie das verarbeitete Bild aussieht, zeigt Abbildung 1.
Listing 3
$ convert penguin_raw.png \ -gravity North -font Liberation-Sans -pointsize 100 \ -stroke '#000000' -strokewidth 20 -annotate 0 'Tux auf Tour' \ -stroke '#0000A0' -strokewidth 10 -annotate 0 'Tux auf Tour' \ -stroke none -fill '#A0A0FF' -annotate 0 'Tux auf Tour' \ -gravity South -pointsize 90 \ -stroke '#000000' -strokewidth 30 -annotate 0 'Folge 80' \ -stroke '#A0A0A0' -strokewidth 15 -annotate 0 'Folge 80' \ -stroke none -fill white -annotate 0 'Folge 80' \ tux_auf_tour.png

convert erlaubt auch das kreative Beschriften von Bildern.” width=”225″ height=”300″ />
Abbildung 1: Das ImageMagick-Toolconvert erlaubt auch das kreative Beschriften von Bildern.PDF-Dateien bearbeiten
Das “Portable Document Format” wird gerne für Dokumentationen und Ähnliches verwendet. Mit ImageMagick erstellen Sie auf die Schnelle ein Fotoalbum in diesem Format, das praktisch jedes moderne Betriebssystem unterstützt:
$ convert *.jpg fotoalbum.pdf
Das erweist sich auch insofern als praktisch, weil die meisten Grafikprogramme eine recht komplexe Druckfunktion mitbringen. PDF-Anzeigeprogramme dagegen sind da einfacher gestrickt, da druckt dann auch der Großvater das Bilderalbum seiner Enkel mit einem Klick aus. Umgekehrt erweist es sich für Webanwendungen oft als praktisch, ein PDF-Dokument in einzelne Bilder zu konvertieren, etwa um sie in eine vorhandene Bilder-Galerie zu integrieren. Hier genügt folgender Aufruf:
$ convert benutzerhandbuch.pdf benutzerhandbuch-%04d.png
Convert schreibt das Ergebnis immer in eine zweite Datei, während mogrify ähnliche Fähigkeiten besitzt, aber immer die existierende Datei modifiziert. Anstatt eine existierende Bilddatei zu verarbeiten, zeichnet Convert auf Wunsch auch eigene mit einer konstanten Fläche einer bestimmten Größe und Farbe. Das Kommando aus Listing 4 zeichnet zum Beispiel ein LinuxUser-Logo (Abbildung 2). Die umfangreichen Zeichenfähigkeiten wie Farbübergänge, Zufallsbilder, diverse mathematische Operationen und Transparenzen beschreibt die ImageMagick-Dokumentation [2].
Listing 4
$ convert -size 320x100 xc:black \ -gravity West -pointsize 80 -fill white -annotate 0 'linux' \ -gravity East -fill yellow -annotate 0 'user' \ -draw 'circle 27,16 27,21' linuxuser.png

Abbildung 2: Mit den richtigen Parametern gefüttert, erstellt Convert auch eigene Bilder, wie dieses LinuxUser-Logo.
Schlussendlich erlaubt die Software sogar das Bearbeiten von Videos ohne Ton, indem es dieses in einzelne Bilder zerlegt, dann entsprechend modifiziert und nach den Korrekturen wieder ein Video daraus generiert. Dafür benötigt die Suite aber unter Umständen die Hilfe externer Programme wie Ffmpeg.
Ein einfaches Beispiel sehen Sie in Listing 5. Der String %06d gibt dabei das Namensschema der erzeugten Bilder an, im Beispiel sechsstellige Zahlen mit führenden Nullen. Das Listing zeigt zudem eine weitere Möglichkeit, etwas auf mehrere Bilder anzuwenden: Mogrify, das ja immer das existierende Bild überschreibt, erlaubt ebenfalls das Bearbeiten mehrerer Bilder gleichzeitig.
Listing 5
$ convert a.wmv b-%06d.png $ mogrify -scale 50% -type Grayscale -swirl 180 b*.png $ convert b*.png c.wmv
Programme mit Mausbedienung
Imagemagick bringt auch zwei Programme mit, bei denen die Mausbedienung eine Rolle spielt. Das erste ist import, mit dem Sie recht einfach Screenshots anfertigen. Das Kommando import screenshot.png lässt Sie mit der Maus einen Bereich auswählen, den Sie aufnehmen möchten; mit dem Schalter -window root erfasst Import gegebenenfalls den kompletten Bildschirminhalt.
Das Tool display dient dazu, auf einfache Weise Bilder anzuzeigen, wobei jede Maustaste eine Funktion übernimmt: Die linke bringt ein einfaches Menü zum Vorschein, mit der mittleren vergrößern Sie einen Bildausschnitt und fragen Informationen wie Farbe und Position einzelner Pixel ab. Die rechte Taste ermöglicht das vor- und zurückblättern (Abbildung 3).

Abbildung 3: Das Tool Display erlaubt das schnelle Anzeigen von Bildern und bietet darüber hinaus auch Bearbeitungsmöglichkeiten an.
ImageMagick versteht auch Fonts als Grafik. So zeigt die Ausgabe des Kommandos aus der ersten Zeile von Listing 6 eine Schriftprobe des Fonts LiberationMono-Italic an. Der Befehl aus der zweiten Zeile wandelt diese in andere gängige Grafikformate um, beispielsweise um sie auf einer Webseite anzuzeigen (Abbildung 4).
Listing 6
$ display /usr/share/fonts/truetype/LiberationMono-Italic.ttf $ convert /usr/share/fonts/truetype/LiberationMono-Italic.ttf LiberationMono-Italic.png
Erweiterte Möglichkeiten
Das Tool Compare ist sogar in der Lage, Suchbilder zu lösen. Es vergleicht dazu zwei Bilder und markiert die unterschiedlichen Pixel. Das Beispiel aus Listing 7 verdeutlicht das anhand zweier mittels Convert erstellter Grafiken mit je einem Kreis. Die ersten zwei Werte aus den Draw-Befehlen geben den Mittelpunkt an, die nächsten zwei definieren einen weiteren Punkt am Kreis. Im zweiten Bild erscheint der Kreis etwas nach rechts verschoben. Als Resultat des Vergleichs mit Compare ergeben sich dann als Resultat zwei Mondsicheln, die die Unterschiede verdeutlichen (Abbildung 5).
Listing 7
$ convert -size 200x200 xc:white -fill yellow -draw 'circle 100,100,50,100' 1.png $ convert -size 200x200 xc:white -fill yellow -draw 'circle 130,100,80,100' 2.png $ compare 1.png 2.png imagecompare.png

Abbildung 5: Ergebnis eines mittels Compare vorgenommenen Vergleichs zweier Bilder mit verschobenen Kreisen.
Der Befehl composite hingegen erlaubt, Bilder zu kombinieren. Das folgende Kommando fügt beispielsweise in einem Foto rechts oben das vorher selbst gebastelte LinuxUser-Logo transparent ein (Abbildung 6):
$ composite -gravity NorthEast -dissolve 20% -geometry +20+20 linuxuser.png penguin_raw.png pinguin-mit-logo.png

Abbildung 6: Composite kombiniert mehrere Fotos miteinander und lässt Ihnen dabei eine Menge Gestaltungsspielraum.
Des Weiteren gibt identify Informationen zu einem Bild aus, der Schalter -verbose erweitert diese noch. Das Tool animate zeigt mehrere Bilder hintereinander als Slideshow an. Das Programm conjure führt Operationen ähnlich wie convert oder mogrify aus; anstatt von Kommandozeilenoptionen erlaubt es jedoch die Übergabe von Operationen mittels einer XML-basierten Eingabedatei, der “Magick Scripting Language” (MSL). Zu guter Letzt erweist sich stream unter anderem zum Verarbeiten von sehr großen Bildern als nützlich – es schreibt den gewählten Ausschnitt eines Bilds in eine eigene Datei.
Um alle Feinheiten der Programme kennenzulernen empfehlen wir, die ImageMagick-Projektseite zu besuchen oder die Hilfefunktion und Manpages zu konsultieren. Die umfangreiche Liste der unterstützten Grafikformate zeigt der Aufruf convert -list format.
Einsatz in eigenen Programmen
In eigenen Programmen nutzen Sie ImageMagick einerseits über die Kommandozeilentools, wie es zahlreiche gängige Anwendungen tun, darunter auch Mediawiki (Abbildung 7). Alternativ basteln Sie sich einen Befehlsstring zusammen und führen ihn in Programmiersprachen wie C, PHP oder Perl mittels des Aufrufs system() aus. Die zweite Möglichkeit besteht darin, direkt die Bibliotheken zu verwenden: ImageMagick bieten umfangreiche APIs für viele Programmiersprachen.

Abbildung 7: Auch die beliebte Wiki-Software Mediawiki bedient sich der Fähigkeiten von ImageMagick.
Als erstes Beispiel soll ein PHP-Programm dienen. Ruft ein Nutzer Ihre Webseite mit vielen Grafiken über einen Webbrowser auf einem Mobilgerät ab, so verrät Ihnen das $_SERVER['USER_AGENT']. Um Datenvolumen zu sparen und die Kompatibilität zu erhöhen, liefern Sie diesem Nutzer die Grafiken idealerweise on-the-fly verkleinert aus. Sie benötigen dafür das Paket php5-imagick; Listing 8 zeigt, wie es funktioniert. Statt wie im Beispielprogramm auf eine fixe Breite von 200 Pixeln zu skalieren, könnten Sie den Besucher auch vorher eingeben lassen, wie stark die Webseite die Grafiken komprimieren soll.
Listing 8
<?php
// PNG-Bild ausgeben
header("Content-type: image/png");
// Beispielgrafik einlesen
$thumb=new Imagick("beispiel.png");
// auf 200px Breite skalieren
$thumb->thumbnailImage(200,0);
// Bild ausgeben
echo $thumb;
?>
Das kurze Perl-Beispiel aus Listing 9 verwendet ImageMagick beziehungsweise das Perl-Modul Image::Magic, um ein farbiges PNG-Bild einzulesen, dieses nach Schwarzweiß zu konvertieren und das Resultat als GIF-Datei zu speichern.
Listing 9
#!/usr/bin/perl
use strict;
use warnings;
use Image::Magick;
my $image = Image::Magick->new;
$image->Read('farbig.png');
$image->Quantize(colorspace=>'gray');
$image->Write(filename=>'schwarzweiss.gif');
Und als Letztes noch ein kurzes Beispiel in C, diesmal unter Verwendung des ImageMagick-Forks GraphicsMagick (siehe Kasten “GraphicsMagick”). Um die Bibliotheken zu verwenden, bieten ImageMagick und GraphicsMagick sowohl ein Low-Level-Interface als auch eine einfachere High-Level-API namens MagickWand an. Listing 10 zeigt den Einsatz von MagickWand, um einen Aufruf convert beziehungsweise gm convert nachzubauen.
Listing 10
/* Konvertiert ein Eingabebild in ein
Ausgabebild in einem anderen Bildformat.
Aufruf: myconvert eingabebild ausgabebild
*/
#include <wand/magick_wand.h>
int main(int argc, char **argv) {
/* MagickWand-Handle */
MagickWand *mw;
/* Initialisierung von GraphicsMagick */
InitializeMagick(*argv);
mw=NewMagickWand();
/* Bild einlesen */
MagickReadImage(mw, argv[1]);
/* Bild in neuem Format schreiben */
MagickWriteImage(mw, argv[2]);
/* De-Initialisierung von GraphicsMagick */
DestroyMagickWand(mw);
DestroyMagick();
}
Im Gegensatz zu den unzähligen Optionen der Originalprogramme konvertiert das Beispiel aber tatsächlich nur zwischen verschiedenen Grafikformaten, also beispielsweise von GIF nach PNG. Sie übersetzen den Quelltext mit folgendem Kommando:
$ gcc myconvert.c -omyconvert $(GraphicsMagickWand-config --cppflags --ldflags --libs)
Die Schalter in Klammern sorgen hier dafür, dass der Compiler GCC die richtigen Flags und Bibliotheken verwendet.
GraphicsMagick
Bei GraphicsMagick [3] handelt es sich um einen 2002 entstandenen Fork von Imagemagick mit recht ähnlichen Fähigkeiten wie das Original. Allerdings gibt es bei GraphicsMagick im Gegensatz zu Imagemagick, das aus etlichen einzelnen Komponenten wie Convert, Mogrify oder Display besteht, lediglich den Generalbefehl gm. Ihn ergänzen Sie um die gewünschte Operation, beispielsweise gm convert oder gm mogrify. Die Tabelle “Programme und Funktionen” beschreibt die Schalter beider Komponenten.
Programme und Funktionen
| ImageMagick | GraphicsMagick | Funktion |
|---|---|---|
animate |
gm animate |
Bildserie anzeigen |
| – | gm batch |
mehrere Befehle als Skript ausführen |
| – | gm benchmark |
einen Befehl benchmarken |
compare |
gm compare |
Bilder vergleichen |
composite |
gm composite |
Bilder überlagern |
conjure |
gm conjure |
Magick-Scripting-Language-Skript (XML) ausführen |
convert |
gm convert |
Bilder konvertieren |
display |
gm display |
Bild anzeigen |
| – | gm help |
Hilfe anzeigen |
identify |
gm identify |
Bildinformationen anzeigen |
import |
gm import |
Screenshot erstellen |
mogrify |
gm mogrify |
Bild modifizieren |
montage |
gm montage |
Bilder kombinieren |
stream |
– | Bildausschnitt lesen |
| – | gm time |
Ausführungsdauer eines Befehls messen |
| – | gm version |
Version anzeigen |
Weitere Programme
Neben den beiden Platzhirschen mit ihren umfangreichen Funktionen gibt es einige weitere Kommandozeilenprogramme, die mit ihren teils sehr speziellen Fähigkeiten durchaus ebenfalls eine Daseinsberechtigung haben. Die wichtigsten davon sind:
- Exiftool [4], das EXIF-Metadaten modifiziert,
- Optipng [5] und Pngcrush [6], die PNGs optimieren und verkleinern,
- Jpegtran [7], das verlustfreie Modifikationen an JPEGs vornimmt, sowie
- Steghide [8] und Outguess [9], die mittels Steganografie Informationen in Bildern verstecken.
Das Programm Exiftool gibt die EXIF-Metadaten von Bildern aus und modifiziert sie bei Bedarf. Diese Metadaten enthalten unter anderem den verwendeten Kameratyp, das Aufnahmedatum, unter Umständen auch die GPS-Koordinaten und die Seriennummer der Kamera. Um sich die Liste der möglichen Werte anzusehen, geben Sie exiftool -list ein. Mit exiftool bild.jpg geben Sie die enthaltenen Daten aus. exiftool -all= bild.jpg löscht alle unnötigen Metadaten – das erweist sich womöglich als sinnvoll, wenn Sie Bilder online stellen möchten. Alternativ fügen Sie auch weitere Daten hinzu. So schreibt das Kommando exiftool -comment="Text" bild.jpg einen Kommentar ins Bild.
Der Aufruf optipng bild.png optimiert PNGs, beispielsweise durch Reduzieren der Farbtiefe oder stärkere Kompression. Im Test verkleinerte das Tool die Dateigröße eines Bildes um knapp 70 Prozent. Mit Jpegtran modifizieren Sie JPEG-Dateien. Die Eingabe von jpegtran -optimize a.jpg >b.jpg optimiert ein Bild, jpegtran -rotate 90 a.jpg >b.jpg rotiert es um 90 Grad. Die Tools Steghide und Outguess schließlich dienen dazu, Informationen steganografisch in Bildern zu verbergen [10].
Fazit
Gerade wenn es um das automatisierte Modifizieren eines oder mehrerer Bilder geht, lassen Kommandozeilenprogramme ihre GUI-Vettern weit hinter sich. Dank der entsprechenden APIs der Tools lassen sich auch eigene Programme einfach um Grafikfähigkeiten erweitern.
Glossar
-
Steganografie
-
Steganografische Methoden verstecken Daten in anderen Dateien. Gut eignen sich dafür Bilder mit hoher Farbtiefe. Häufig genügt das minimale Verändern zum Beispiel der Farbtiefe, sodass das menschliche Auge den Unterschied nicht mehr erkennt. Die modifizierten Bits enthalten dann die versteckten Informationen.
Infos
[1] ImageMagick: http://www.imagemagick.org
[2] Zeichenfunktionen von Convert: http://www.imagemagick.org/Usage/canvas/
[3] GraphicsMagick: http://www.graphicsmagick.org
[4] Exiftool: http://owl.phy.queensu.ca/~phil/exiftool/
[5] Optipng: http://optipng.sourceforge.net
[6] Pngcrush: http://pmt.sourceforge.net/pngcrush/
[7] Jpegtran: http://www.libjpeg-turbo.org
[8] Steghide: http://steghide.sourceforge.net
[9] Outguess: http://www.outguess.org
[10] Stegano/Anti-Stegano: Erik Bärwaldt, “Eins, zwei, drei, ich komme!”, LU 04/2008, S. 80, https://www.linux-community.de/15241
[11] GNU Parallel: Tim Schürmann, “Multiple Persönlichkeit”, LU 06/2013, S. 13, https://www.linux-community.de/28516






