ubuntuusers.de

ubuntuusers.deWikiImageMagick

ImageMagick

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

./logo.png ImageMagick {en} ist ein freies, quelloffenes Softwarepaket zur Erstellung und Bearbeitung von Rastergrafiken. ImageMagick kann momentan mehr als 90 der meist verwendeten Bildformate lesen, verändern und schreiben. Außerdem lassen sich Bilder dynamisch generieren, weshalb es auch von Webanwendungen verwendet wird.

Eine Alternative ist das Programm graphicsmagick {en}, eine Abspaltung von ImageMagick. Es kann ebenfalls über die Paketverwaltung installiert werden.

Installation

Bevor die beschriebenen Tools benutzt werden können, muss das folgende Paket installiert werden.[1] Angesichts der umfangreichen Kommandozeilenoptionen ist auch die Dokumentation empfehlenswert.

  • imagemagick

  • imagemagick-doc

Wiki/Vorlagen/Installbutton/button.png mit apturl

Paketliste zum Kopieren:

sudo apt-get install imagemagick imagemagick-doc 

sudo aptitude install imagemagick imagemagick-doc 

Eine Konfiguration ist nicht nötig.

Übersicht

ImageMagick bietet 11 Kommandozeilenprogramme,[2] die alle auf einen gemeinsamen Satz von Bibliotheken zugreifen, die wiederum das Schreiben und Lesen vieler verschiedener Dateiformate und umfangreiche grafische Arbeiten ermöglichen.

  • animate - spielt mehrere Bilder schnell hintereinander ab

  • convert - liest Bilder, bearbeitet sie und speichert sie ab

  • compare - vergleicht 2 Bilder und gibt die Unterschiede als Bilddatei aus

  • composite - überlagert mehrere Bilder zu einem Bild

  • conjure - führt Skripte in der Skriptsprache von ImageMagick aus

  • display - stellt Bilder auf einem X-Server dar

  • identify - gibt Dateiformat, Bildgröße usw. von Bilddateien aus

  • import - macht Bildschirmfotos

  • montage - fasst mehrere Bilder zu einem großen Einzelbild zusammen

  • mogrify - wie convert, nur dass die Eingabedatei durch die Ausgabedatei ersetzt wird!

  • stream - liest aus Bilddateien Teile aus und gibt sie als Rohdaten, Fließkommazahlen oder ähnliches aus

Zu jedem Kommandozeilenprogramm gibt es eine Manpage. Die separate Dokumentation befindet sich unter:

  • /usr/share/doc/imagemagick-doc/index.html

Von hier aus findet man auch zu jedem Kommandozeilenprogramm eine HTML-Seite mit Anwendungsbeispielen.

ImageMagick-Programme bieten 241 verschiedene Kommandozeilenoptionen und grafische Operationen. Da viele Optionen von mehreren Kommandozeilenprogrammen verstanden werden, ist eine detaillierte Erklärung aller Optionen in der folgenden Datei zusammengefasst:

  • /usr/share/doc/imagemagick-doc/www/command-line-options.html

convert

Möchte man ein Bild bearbeiten, so kann man den Befehl convert nutzen. Ein Bild wird geladen, bearbeitet und (ggf. in einem anderen Format) abgespeichert.

convert EINGABEBILD.jpg [Optionen] AUSGABEBILD.png 

Im einfachsten Fall (ohne Optionen) kann convert zur Umwandlung in ein anderes Dateiformat verwendet werden. Dabei wird das Format der Eingabedatei automatisch bestimmt und das der Ausgabedatei (falls keine weiteren Angaben gemacht werden) anhand der Dateiendung.

Da convert über 200 Optionen auf der Kommandozeile versteht, sei hier für Details auf die Dokumentation verwiesen. Hier sind ein paar nützliche Beispiele.

Bilder mit Wasserzeichen versehen

Mit Hilfe von ImageMagick lassen sich ganz einfach sichtbare Wasserzeichen in JPG-Bilder einbringen. Das folgende kleine Bash-Skript erleichtert die Arbeit:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash
# Wasserzeichentext in alle JPEG Bilder aus diesen Verzeichnis einfuegen
# Der Wasserzeichentext wird unten links ins Bild eingebracht
# Sie koennen folgende Parameter anpassen:
Textabstandvonlinks=10
Textabstandvonunten=10
Schriftgroesse=10
PfadFonts="/usr/share/fonts/truetype/msttcorefonts"
# Pfad ist je nach Distribution unterschiedlich!
Schriftart="Arial.ttf"
Schriftfarbe="white"
# Moegliche Farben koennen aufgelistet werden mit dem Befehl: convert -list color
Wasserzeichentext="Copyright Ubuntu"

# Programmbeginn
echo "Textabstand von links: $Textabstandvonlinks"
echo "Textabstand von unten: $Textabstandvonunten"
echo "Schriftgoesse: $Schriftgroesse"
echo "Schriftart: $Schriftart"
echo "Schriftfarbe: $Schriftfarbe"
echo "Wasserzeichentext: $Wasserzeichentext"
echo " "
ls -1 *.JPG *.jpg | while read file;
 do {
horizontal=`identify -verbose $file | grep Geometry: | awk {'print $2'} |cut -d"x" -f 1`
vertikal=`identify -verbose $file | grep Geometry: | awk {'print $2'} |cut -d"x" -f 2`
X=$Textabstandvonlinks
Y=$(($vertikal - $Textabstandvonunten))
convert -font $PfadFonts/$Schriftart -pointsize $Schriftgroesse -fill $Schriftfarbe -draw "text $X, $Y '$Wasserzeichentext'" "$file" "`basename Wasserzeichen_"$file"`";
echo "Bearbeite Datei $file"
}
done
echo "Wasserzeichen wurden erfolgreich eingearbeitet"
exit
# Programmende

Bilder / Fotos nachbearbeiten

Manchmal möchte oder muss man Bilddateien nachbearbeiten. Dies können z. B. mit der Digitalkamera aufgenommene Fotos sein, damit diese "vorzeigbar" oder verschickbar sind. Im folgenden wird davon ausgegangen, dass die Bilder "alltägliche" Motive sind und nicht unter Extrembedingungen aufgenommen wurden (also keine Nachtaufnahmen oder Gegenlichtaufnahmen mit besonderem künstlerischen Anspruch.) Mit convert und verschiedenen Optionen lassen sich Fotos bearbeiten:

convert QUELLDATEI.jpg [Optionen] ZIELDATEI.jpg 
convert
ParameterErklärung
QUELLDATEI.jpgEingabe. Das Dateiformat wird automatisch bestimmt.
-rotate 90 Dreht Bild um 90 Grad nach rechts, -90 entsprechend nach links.
-fx u*(2-j/h)*0.75 Aufhellen des oberen Bildteils. Wenn man mit Blitz fest in der Kamera eingebaut fotografiert, ist der Vordergrund unten im Bild fast immer leicht überbelichtet und der Hintergrund oben stark unterbelichtet. Mit dieser Funktion wird der Vordergrund leicht abgedunkelt (-25%) und der Hintergrund stark aufgehellt (+50%). Das Ergebnis ist etwas kontrastarm, was aber mit dem darauf folgenden -normalize berichtigt wird.
-fx u*(1+j/h)*0.75 Aufhellen des unteren Bildteils.
-fx u*(2-i/w)*0.75Aufhellen des linken Bildteils.
-fx u*(1+i/w)*0.75 Aufhellen des rechten Bildteils.
-normalize Streckt das Histogramm, so dass schwarz die dunkelste und weiß die hellste Farbe ist. Ergibt fast immer ein optimales Ergebnis. Wichtig!
-gamma 1.10,1.05,1.0 Verstärkt den Rot- und Grünanteil und macht das Bild so "wärmer". Bei Bedarf nach eigenem Geschmack, Digitalkamera und Monitor anpassen!
-fx u+${mt}*(1-u)*u Verändert die "Mitteltöne". Sinnvolle Werte für $mt liegen zwischen -1.0 (abdunkeln, z. B. bei grellem Sonnenschein) und 1.0 (Aufhellen, z. B. bei Gegenlicht). Diese Funktion hat den Vorteil, dass beim Aufhellen helle Partien nicht im gleißendem Weiß "ersaufen", sondern lediglich kontrastärmer dargestellt werden, analog beim Abdunkeln. Meist nicht nötig.
-resize 50% "Verkleinert" das Bild proportional auf 50 % der waagerechten Kantenlänge.
-resize '1024x1024' Verkleinert das Bild auf maximal 1024 Pixel Höhe und Breite unter Beibehaltung des Seitenverhältnisses.
-quality 88% Setzt Qualität der folgenden JPG-Kompression. Je größer die Zahl, desto weniger Artefakte und je größer die Zieldatei.
ZIELDATEI.jpgAusgabe im jpg-Format mit der vorher angegebenen Qualität. Durch andere Dateiendungen können andere Ausgabeformate gewählt werden.

Anmerkungen:

  • Die Optionen sollten in der angegebenen Reihenfolge verwendet werden.

  • Die Option -fx dauert recht lang (bis zu einer Minute)

Gescannte Dokumente nachbessern

Wenn man Texte aller Art (Zeitungsartikel, Urkunden, Akten usw.) scannt und als Bilddatei abspeichert, sind die Bilddateien meist weder besonders schön noch klein und handlich:

  • Die Dateien sind groß, typischerweise um 4 MB für eine DIN-A4-Seite mit 200 dpi im .png-Format.

  • Weiße Hintergründe sind nicht weiß, sondern hellgrau, hellbraun usw. Beim Ausdrucken wirken sie schmutzig und verschwenden Tinte.

  • Schwarze Buchstaben sind dunkelgrau und wirken beim Ausdrucken blass.

  • Schwarzweiße Kanten bekommen farbige Pixel.

Manchmal kann man bereits im Scanprogramm "Strichgrafik" o.ä. wählen, so dass beim Einscannen speichersparende und optisch ansprechende Schwarzweißgrafik entsteht. Wenn das keine gewünschten Ergebnisse bringt, kann man immer noch mit voller Farbtiefe einscannen und durch geschickte Nachbearbeitung die Bilddateien optisch verschönern und gleichzeitig verkleinern.

convert ROHDATEI.png \
    -normalize -gamma 0.8,0.8,0.8 \
    -colorspace HSL \
    -channel saturation -fx 'min(1.0,max(0.0,3*u.g-1))' \
    -colorspace RGB \
    +dither -posterize 3 \
    BEARBEITET.png 
convert
ParameterErklärung
ROHDATEI.pngEingabe. Das Dateiformat wird automatisch bestimmt.
-normalize streckt das Histogramm, so dass schwarz die dunkelste und weiß die hellste Farbe ist.
-gamma 0.8,0.8,0.8 Dunkelt Mitteltöne (bei Werten kleiner 1) etwas ab. Buchstaben werden ansonsten zu dünn.
-colorspace HSL Wandelt RGB-Werte in Hue-Saturation-Lightness-Werte um. Vorbereitung für nächsten Schritt.
-channel saturation -fx 'min(1.0,max(0.0,3*u.g-1))' Macht aus Farben mit Sättigung < 33 % grau und Farben mit Sättigung > 67 % eine gesättigte Farbe. Hiermit werden bunte Ränder oder Flecken bei unbunten Vorlagen verringert. Eine nähere Erklärung von -fx findet man in der Dokumentation von convert.
-colorspace RGB Wandelt HSL-Werte zurück in RGB-Werte um.
+dither -posterize 3 Reduziert in jedem Farbkanal die Zahl der Stufen auf 3 ohne Dithering. Empfehlenswert sind 2 bis 4. Hier wird der Hintergrund richtig einheitlich weiß (oder was auch immer). Rauschen verschwindet bis auf ein paar verstreute Pixel.
BEARBEITET.pngAusgabe. Dafür ist das png-Format geeignet. Dazu einfach einen Dateinamen mit Endung .png wählen.

Mit diesen Optionen liefert convert recht zuverlässig gute Ergebnisse. Die Ausgabe (eine DIN-A4-Seite mit 200 dpi) ist ca. 50 - 300 kB groß. Bei Bedarf können die Gammawerte, die Steilheit der Sättigungsfunktion und die Zahl der Stufen bei der Reduktion der Intensitätsstufen verändert werden.

Anmerkungen:

  • Die Abarbeitung von Funktionen durch convert mit Option -fx ist etwas langsam. Der obige Befehl kann daher rund eine Minute dauern.

  • Bilder in den gescannten Dokumenten werden ebenfalls mitbearbeitet und erscheinen daher verfremdet. Hier hilft nur manuelles Einsetzen des Originalbildes in die Ausgabe.

  • Wenn die Texthintergründe Rasterpunkte enthalten, erscheinen sie meist auch in der Ausgabe. Hier muss man ggf. manuell mit einem Bildbearbeitungsprogramm (z. B. GIMP) Bereiche markieren und geschickt Farben durch andere ersetzen, um einfarbige Hintergründe zu erhalten, z. B. bei schwarzem Text auf rot-weiß gerastertem Hintergrund würde man rot und weiß durch rosa ersetzen.

  • Werden Dokumente fotografiert statt eingescannt, können die Bilddateien ebenfalls mit convert bearbeitet werden. Es gibt jedoch Probleme, wenn die Vorlage nicht gleichmäßig ausgeleuchtet ist. Außerdem sollte man durch geeignete Wahl des Zooms sicherstellen, dass das Bild nicht tonnen- oder kissenförmig verzerrt ist.

mogrify

Mit mogrify kann man ein Bild laden, bearbeiten und abspeichern. Es hat viele aber nicht alle Optionen gemeinsam mit convert. Der wesentliche Unterschied ist, dass mogrify die Eingabedatei durch die neue Bilddatei ersetzt!

mogrify  [Optionen] bilddatei 

import

import bietet die Möglichkeit, ein Foto des gesamten Bildschirms, eines Fensters oder eines definierten Ausschnittes zu erzeugen. Man kann auch in regelmäßigen Abständen Bildschirmfotos erstellen.

Obwohl import ein Kommandozeilenprogramm ist, arbeitet es über die grafische Benutzeroberfläche mit Unterstützung der Maus. Man tippt einfach im Terminal [3] den Befehl ein:

import window.png 

Der Mauszeiger verändert sich zu einem Kreuz. Dann kann man auf das gewünschte Fenster klicken oder mit gedrückter Maustaste den Ausschnitt definieren und abspeichern.

Ausschnitt in der Kommandozeile wählen

Natürlich kann man den gewünschten Ausschnitt auch in der Kommandozeile definieren, z. B. den rechten oberen Bereich des Bildschirms:

import -window root -crop 512x256-0+0 -quality 90 corner.png 

Man kann auch einzelne Fenster und Fensterausschnitte definieren. Das Fenster kann man durch seinen Namen oben auf der Fensterleiste benennen. Wenn z. B. Google Earth die Bilder zu dunkel darstellt, kann man mit mehreren ImageMagick-Programmen hintereinander einen Screenshot des Ausschnitts des Fensters erstellen, das Bild bearbeiten und schließlich darstellen:

import -silent -pause 3 -window 'Google Earth' -crop 800x650+250+50 /tmp/screenshot.png \
&& convert /tmp/screenshot.png -fx '4*u' -normalize /tmp/screenshot.png \
&& display /tmp/screenshot.png \
&& rm -f /tmp/screenshot.png 

Mit -silent wird der Piepton unterdrückt. Dann wartet import drei Sekunden (Währenddessen muss man vom Terminalfenster zum Google-Earth-Fenster wechseln, weil sonst abgedeckte Bereiche schwarz erscheinen würden). Dann wird aus dem gewählten Fenster der mit -crop gewählte Ausschnitt als Bild gespeichert. convert bearbeitet das Bild, und display stellt es dar.

Fernwartung

Die Programme import und display lesen von bzw. schreiben auf das Display, welches in der Umgebungsvariable $DISPLAY angegeben ist (auf dem lokalen Rechner meist "localhost:0.0"). Man kann sich daher auf einem entfernten Rechner anmelden, dessen lokalen Bildschirm abfotografieren und auf dem Bildschirm des eigenen Rechners anzeigen lassen. Das ist nützlich, wenn man den entfernten Rechner über SSH wartet und dem Anwender auf seinen Bildschirm schauen möchte.

Dazu meldet man sich über SSH in den entfernten Rechner an (in diesem Beispiel gast@rechner). Die Verbindung vom entfernten Rechner zum lokalen XServer muss dabei getunnelt werden (das kann auch von einem Windows-Rechner mit SSH-Client und XServer geschehen).

Dann muss man das Display und den Benutzernamen des lokalen Anwenders auf dem entfernten Rechner bestimmen (Display ist meist ":0.0".) Dazu sucht man alle XServer in der Prozessliste und findet dort das Display in der angezeigten Kommandozeile. In diesem Beispiel sind es zwei XServer mit den Displays ":0.0" und ":20.0".

gast@rechner:~ $ ps -ef| grep /X 

Ergebnis:

root     22870 22866  0 15:34 tty8     00:00:01 /usr/X11R6/bin/X :20 -br -audit 0 -auth /var/lib/gdm/:20.Xauth -nolisten tcp vt8
root     24709  4152  0 11:20 tty7     00:02:28 /usr/X11R6/bin/X :0 -br -audit 0 -auth /var/lib/gdm/:0.Xauth -nolisten tcp vt7
gast 26726 23513  0 16:07 pts/2    00:00:00 grep /X

Um festzustellen, welches Display gerade aktiv ist, nimmt man die Parent-Prozess-ID der XServer und sucht darunter die Kindprozesse gnome-session oder x-session-manager.

gast@rechner:~ $ ps -ef| grep 4152 | grep session
gast@rechner:~ $ ps -ef| grep 22866 | grep session 

Ergebnis:

bob        23005 22866  0 15:35 ?        00:00:00 x-session-manager

Es gibt keinen Kindprozess mit diesen Namen unter 4152, aber einen unter 22866. Das heißt, das aktive Display ist also ":20.0", und der Benutzer heißt bob.

Auf dem Zielserver legt man eine Datei an, die sowohl der Gast als auch Bob beschreiben können:

gast@rechner:~ $ touch /tmp/screenshot.png
gast@rechner:~ $ chmod 666 /tmp/screenshot.png 

Das Display kann nur vom Besitzer ausgelesen werden. Das bedeutet, der Gast muss import als Benutzer bob starten und das Bild in die gemeinsam lesbare Datei abspeichern. Die Option -silent bewirkt, dass es auf dem entfernten Rechner nicht piept, und muss, wenn sie verwendet werden soll, nach display stehen. Bei Bedarf kann import die Grafik verkleinern, den Farbraum reduzieren und vieles mehr.

gast@rechner:~ $ sudo su - bob -c 'import -display :20.0 -silent -window root -resize 50% /tmp/screenshot.png' 

Dann kann man mit display das Bild auf dem Default-Display anzeigen. Das Default-Display ist hier localhost:13.0, das über den SSH-Tunnel zum lokalen Rechner getunnelt wird (Man kann es sich durch echo $DISPLAY anzeigen lassen).

gast@rechner:~ $ display /tmp/screenshot.png 
Xlib:  extension "Generic Event Extension" missing on display "localhost:13.0".
^C
gast@rechner:~ $ 

Die oben gezeigte Fehlermeldung kann man ignorieren. display kann über das Fenster auf dem lokalen Rechner geschlossen werden oder durch Strg + C in der Konsole auf dem entfernten Rechner.

montage

Hat man einen (komplizierten) Sachverhalt mit Hilfe einer Bilderfolge festgehalten, ist es empfehlenswert, das Ganze in ein einziges Bild zusammenzupacken oder in ein PDF-Dokument zu konvertieren. Bei PDFs würde aber überlicherweise nur ein Bild pro Seite angezeigt.

Mit Hilfe des Befehls montage im Terminal [2] werden die Einzelbilder zu einem großen Bild zusammengefügt, d.h. in diesem Fall aneinander gehängt und anschließend ins .pdf-Format umgewandelt. Es entsteht der Eindruck eines "Filmstreifens". Unter den Bildern steht der Dateiname (als Label).

montage -label %f -geometry 800x600+10+10 *.png test.pdf 

composite

Mit composite lassen sich Bilder übereinander legen; ein Anwendungsbeispiel findet sich in JFotokopie, das diesen Programmteil für die "Mehrfachkopie" nutzt.

PDF-Bearbeitung

Mit convert können bspw. gescannte Dokumente als PDF gespeichert werden. Die Befehls-Syntax zum einfachen Speichern einer PNG-Datei im PDF-Format lautet:

convert quelle.png ziel.pdf 

Mit folgendem Befehl kann man Bilder aus PDF-Dateien extrahieren:

pdfimages -j quelle.pdf zielverzeichnis 

Praktisch ist auch die Verwendung von Wildcards, um mehrere Bilder in ein PDF umzuwandeln. Folgender Befehl wandelt bspw. alle im momentanen Arbeitsordner befindlichen .jpg-Dateien in ein mehrseitiges PDF um:

convert *.jpg ziel.pdf 

Will man mehrere Bilder in einem Ordner zu einem druckfertigen PDF Dokument mit gleichmäßiger DINA4-Anpassung zusammenfügen, hilft folgender Befehl:

convert *.* -compress jpeg -resize 1240x1753 -units PixelsPerInch -density 150x150 -page a4 multipage.pdf 

Massenbearbeitung

Um mehrere Dateien auf einmal zu konvertieren, benutzt man das Schleifenkonstrukt for ... in einer Shell. Beispiel:

for i in *.png; do BEFEHL -OPTIONEN $i; done 

In diesen Beispiel werden alle Bilder eines Ordners im PNG-Format nacheinander umgewandelt. BEFEHL und -OPTIONEN bitte entsprechend anpassen!

Alternativ zu der Schleife kann auch mogrify verwendet werden. Beispiel:

mogrify -format jpg *.png 

In dem Beispiel werden alle Dateien im aktuellen Verzeichnis vom PNG-Format ins JPG-Format umgewandelt.

Alternativen

ExactImage von ExactCODE {en} liefert auf Geschwindigkeit optimierte Optionen, allerdings nicht in dem Umfang wie ImageMagick. Auch mit GIMP sind sehr viele Bearbeitungsmöglichkeiten gegeben, allerdings eher für die Bearbeitung einzelner Bilder, weniger für Stapelverarbeitung. Phatch ist ein alternativer "Photo Batch Processor" mit grafischer Oberfläche.

Diese Revision wurde am 17. Juli 2014 17:55 von frustschieber erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Grafik, Shell, Bildbearbeitung