Open Source im professionellen Einsatz

© Anyka, Fotolia.com

Automatische Bildbearbeitung mit Imagemagick

Zauberlehrling

Fotos mit Imagemagick bearbeiten erscheint manchem wie Hexerei: Durch Hunderte Optionen beeinflusst, zaubern die Kommandozeilenwerkzeuge Kunstwerke aus banalen Bildern oder verwandeln ihr Format. Ein Meister der Bildmagie braucht etwas Hintergrundwissen und viel Fantasie.

Wer bei Bildbearbeitung nur an Gimp denkt, übersieht das für viele Aufgabe besser geeignete Imagemagick [1]. Automatisierung, Skripting, Reproduzierbarkeit, Batchverarbeitung - das ist bei Gimp zwar möglich, geht mit Imagemagick aber deutlich leichter. Das Paket besteht aus elf Kommandozeilenprogrammen, angereichert mit Modulen und Schnittstellen für etliche Programmiersprachen von Ada über C, C++ und Java bis Perl, Python, PHP und mehr.

Doch die Mächtigkeit hat ihren Preis: Die Bedienung ist nicht gerade intuitiv, was viele Anwender zum Trial-and-Error-Verfahren verleitet. Das undankbare Resultat sind Imagemagick-Skripte, die zwar augenscheinlich funktionieren, bereits bei leicht geänderten Randbedingungen aber scheitern. Dieser Artikel erklärt die Philosophie hinter dem Programmpaket, um solche Missgeschicke zu vermeiden. Der erste Teil erläutert, wie Imagemagick funktioniert (siehe auch Kasten "Imagemagick intern"), während der zweite Abschnitt an praktischen Beispielen wichtige Optionen vorstellt.

Imagemagick intern

Imagemagick verarbeitet Rasterbilder, also Bilder, die aus Pixeln bestehen. Vektorformate verwandelt Imagemagick intern immer in ein Rasterformat. Für seine Bildverarbeitungsalgorithmen braucht Imagemagick mal einzelne Pixel, mal ganze Bildzeilen oder rechteckige Ausschnitte aus dem Bild. Das Tool arbeitet daher intern mit einem so genannten Pixel-Cache, der den Zugriff auf Bildausschnitte beschleunigt. Für verlustfreie Jpeg-Operationen ist Imagemagick aber nicht geeignet - bei jedem Programmlauf liest es das Bild ein und komprimiert es beim Abspeichern erneut.

Der Pixel-Cache besteht aus vier bis fünf Kanälen. Die ersten vier bilden üblicherweise den Rot-, Grün- und Blau- beziehungsweise Cyan-, Magenta- und Gelb- sowie den Alpha-Kanal. Der letzte optionale Kanal ist für Bilder mit Farbpalette reserviert oder enthält den Schwarz-Kanal bei CMYK-Bildern. Je nachdem, mit welcher Option Imagemagick kompiliert wurde, stehen 8-, 16- oder 32-Bit-Kanäle bereit. In der HDRI-Version sind es 32-Bit-Fließkommawerte, sonst Integers. Der Aufruf »identify -version« informiert über die verfügbare Bittiefe.

Eine geringere Bittiefe bedeutet immer eine schnellere Bearbeitung. Wer also typischerweise nur die Jpeg-Fotos aus seiner Kompaktkamera bearbeitet, kommt mit der Q8-Version gut über die Runden, üblich ist eher Q16.

Ausgefeiltes API

Das Imagemagick-API bietet mehrere Methoden, um auf den Cache zuzugreifen. Der Cache befriedigt sogar Anfragen nach Pixeln außerhalb des eigentlichen Bildes (so genannte Virtual Pixel). Das ist wichtig, um Pixel am Bildrand mit denselben Algorithmen bearbeiten zu können wie alle anderen. Der Pixel-Cache kann in verschiedenen Speicherbereichen oder auf der Platte liegen. Die definierten Grenzen sind mit »convert -list resource« zu erfahren.

Der Cache-Manager verwaltet den Cache und die darin enthaltenen Pixel über Referenzzähler. Eine Clone-Operation kopiert nur die Cache-Attribute und die veränderten Pixel. Das sichert hohe Performance. Neben dem Cache speichert und bearbeitet Imagemagick auch die Bild-Metadaten, zum Beispiel Farb- und Exif-Profile oder Daten wie Breite und Höhe.

Image-Coder und Delegates

Um möglichst einfach erweiterbar zu sein, verwendet Imagemagick so genannte Image-Coder für die Bearbeitung einzelner Bildformate. Die Coder selbst sind als dynamische Bibliotheken realisiert, die Konfiguration liegt in »/usr/lib/ImageMagick-6.3.5/config/coder.xml«.

Die Bearbeitung delegiert Imagemagick teils an externe Programme. Raw-Formate sind so mit »ufraw-batch« oder dem klassischen »dcraw« verfügbar. Die externen Programme müssen nur eines der in Imagemagick eingebauten Formate schreiben oder lesen können. In »/usr/lib/ImageMagick-6.3.5/config/delegates.xml« steht deren Konfiguration.

Optionen

Wer von Imagemagick spricht, meint meist »convert« - das Programm wandelt Bilder um. Es steht im Mittelpunkt dieses Artikels, da es sich um das mächtigste und meistgenutzte Tool der Sammlung handelt und die anderen Programme ähnlich funktionieren.

Convert & Co. sind zwar Kommandozeilenprogramme, sie halten sich aber nicht an den Unix-Standard. Normalerweise bestehen Optionen aus einem Buchstaben, eingeleitet durch ein Minuszeichen, etwa »cp -r«. Alternativ gibt es lange Optionen: »cp --recursive«. Danach folgen als Argumente meist die Dateien, auf denen die Programme operieren. Alle Optionen der Imagemagick-Programme beginnen entgegen dieser Konvention mit nur einem Minus- oder einem Pluszeichen, gefolgt von einer Zeichenkette, etwa »-border«, »-bordercolor« oder »+gravity«. Die Programme erwarten Argumente und Optionen auch an anderen Stellen.

Während frühe Imagemagick-Versionen die Optionen noch weitgehend Unix-üblich interpretierten, führten die Entwickler in Version 6 ein eigenes, in sich konsistentes Konzept ein. Für die Bildbearbeitung ist zum Beispiel die Reihenfolge der Optionen entscheidend. Die Tools unterstützen zwar nach Möglichkeit noch das alte Verhalten, in neuen Skripten empfiehlt es sich aber, diese Konstrukte zu meiden. Dass dies mitunter schwerfällt, ist auch in neueren Artikeln noch zu beobachten [2].

Die recht beeindruckende Menge von 232 Optionen in Imagemagick 6.3.5 verteilt sich auf zwei Gruppen: Einstellungen (Settings) und Operatoren (Operators). Einstellungen ändern nichts am Bild, Imagemagick speichert den neuen Wert lediglich für spätere Operationen. Einen Operator führt Convert sofort aus. Zum Beispiel setzt die Einstellung »-bordercolor blue« die Randfarbe, aber erst der Operator »-border 5« erzeugt einen blauen Rand mit fünf Pixeln Breite.

Rechenmaschine

Die Mathematik und die Informatik kennen drei Varianten, um Operationen zu notieren:

  • Infix-Schreibweise: »a+b«
  • Präfix-Schreibweise: Lisp-typisch als »+ a b«
    oder in der Funktionsnotation »+(a,b)«
  • Postfix-Schreibweise: »a b +«

Letztere ist von der Umgekehrten Polnischen Notation (UPN) bekannt und maschinennah, da die Rechenmaschine die Operanden auf den Stack legt und bei der Abarbeitung von Operatoren genau weiß, wie viele Operanden sie wieder vom Stack nimmt. Auch Imagemagick arbeitet als Rechenmaschine und verarbeitet die Operatoren in Postfix-Notation. Allerdings versucht das Programm - wie erwähnt - auch noch die alte, Unix-nahe Präfix-Variante zu interpretieren.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 8 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook