Hannes Birnbacher, Windhagen/Ww.

Bildbearbeitung mit ImageMagick und Exiftool

Vorbemerkung: Dies ist ein kurz gehaltener "Waschzettel im Web" mit meinen Notizen, welche der Möglichkeiten von ImageMagick als Ergänzung zu Bildbearbeitungsprogrammen wie GIMP mir für die Verwaltung und Aufbereitung von Foto-Dateien nützlich sein können. Meine Beschreibung gilt für die Linux-Version.

Was ist ImageMagick?

ImageMagick ist eine Sammlung von vielen einzelnen Funktionen zur Bildverarbeitung, die es bei http://www.imagemagick.org kostenlos für Windows und Linux herunterzuladen gibt. Das Hauptprogramm wird mit "display" aufgerufen, evtl. mit einer Bilddatei, und zeigt bei Rechtsklick mit der Maus ein Menü von bescheidener Brauchbarkeit. Die Stärken der Software liegen in der Fähigkeit, durch Eintippen eines einzigen Befehls eine Arbeit an einer Vielzahl von Bildern zu vollbringen, anstatt sie einzeln in ein Bildbearbeitungsprogramm einladen und die Arbeitsschritte für jedes neu vollziehen zu müssen.
Anmerkung: Die alten Bilddateien werden überschrieben - also zum Testen auf Kopien arbeiten! Ferner kann Image Magick nicht rekursiv arbeiten, also nicht in einem Schritt Unterverzeichnisse oder eine ganze Festplatte ändern, im Gegensatz etwa zu Exiftools, an das nur ein "-r" anzuhängen ist (s.u.).

Alle Bilder in einem Verzeichnis auf eine maximale Breite oder Höhe von 480 Pixel ändern.

Das vorhandene Seitenformat (nehmen wir mal an, 3:4) soll erhalten bleiben. Hochformat sollen also 360x480 Pixel groß werden, Querformat 480x360 Pixel.
Beispiel: Wir wollen eine Anzahl 5-Megapixel-Aufnahmen unserer Digitalcamera für eine Homepage verkleinern.
Befehl: mogrify -resize 480x480 *
Soll Imagemagick nur größere Bilder verkleinern, aber nicht kleinere Bilder vergrößern, so fügt man ein Häkchen an die Dimensionen an. Damit dieses nicht als eine Ausgabeumleitung interpretiert wird, muss man die Dimensionsangabe in Hochkomma setzen.
Ein Befehl, um Platz zu schaffen und dennoch alle übergroßen Bilddateien auf Bildschirmgröße plus Reserve zu halten, könnte beispielsweise so aussehen:
mogrify -resize '1600x1600>' -quality 50 *.jpg

Dieses Beispiel ändert nur Dateien mit der Endung ".jpg" (Kleinschrift). Will man bestimmte Bilder ausnehmen wie überbreite Panoramafotos, könnte man sie auf eine andere Endung umbenennen wie *.JPG oder *.jpeg.
Hat man Digitalkameras oder Programme, die mal jpg, mal JPG, mal jpeg anfügen, und will das Durcheinander erst mal aufräumen? Linux-Nutzer können standardmäßig nicht einfach mit Wildcard (Sternchen) alles auf einmal umbenennen. Hierfür installiert man sich mmv (multiple move), der Befehl lautet dann:
mmv "*.JPG" "#1.jpg" .
Hinterher ist ekligerweise jedes Bilddatum auf das heutige gesetzt, also führt man den anderweitig schon erwähnten Befehl aus:
exiftool -r '-DateTimeOriginal>FileModifyDate' * -overwrite_original und hat wieder das Aufnahmedatum aus der Kamera als Datei-Datum stehen. Doch Vorsicht mit dem -r, der Befehl wirkt sich auch auf alle Unterverzeichnisse aus. Hat man z.B. einen Link auf eine ganze Archiv-Platte im Verzeichnis stehen, ist mit einer längeren und vielleicht ungewollten Bearbeitung zu rechnen. 

Hinweis:
ist eine Gesamtbreite von 480 Pixel erwünscht, dürfen Hochformat-Bilder aber höher werden, so lautet der Befehl: mogrify -resize 480 *.
Soll die Gesamthöhe auf 480 Pixel beschränkt bleiben, aber die Breite sich je nach Seitenverhältnis bestimmten, so lautet der Befehl: mogrify -resize x480 *.
Man sieht bei diesem Beispiel: das Sternchen steht hier als "Joker" für "Zeichenkette aller Art", der Buchstabe "x" für "mal", also 360 mal 480 oder auch 640 mal 480 Pixel.

Copyrightvermerk o.ä. in jedes Bild reinschreiben (Dateiname mit Wildcards), dabei das Original überschreiben

Ein besonderer Font wird nicht vorgegeben. Der Text soll 10 Pixel vom senkrechten, 50 Pixel vom waagerechten Rand beginnen, defaultmäßig von links oben gezählt. Er soll 10 Punkte hoch werden und in grauer Farbe erscheinen. Alle Bilddateien, die mit einem kleinen ".jpg" enden, sollen dabei erfasst werden.
Befehl: mogrify -pointsize 10 -fill gray -draw "text 10,50 'Copyright Hannes Birnbacher'" *.jpg
Anmerkung: 1.) Nicht die Hochkommata um den Text vergessen, sonst versucht das Programm, den drin stehenden Text auszuführen statt hinzuschreiben.
2.) Man kann reinschreiben, von welchen Ecken die Zählung ausgehen soll. Wie auf einer Landkarte gibt es Norden oben, Süden unten, Westen links, Osten rechts, also heissen die Ecken NorthWest, NorthEast, SouthWest, SouthEast. Der Befehl, um einen Copyrightvermerk links ziemlich weit unten einzusetzen, lautet also: mogrify -pointsize 10 -fill gray -gravity SouthWest -draw "text 10,20 'Copyright Hannes Birnbacher'" *.jpg.

Alle JPG-Bilder in einem Verzeichnis auf eine bestimmte Qualität (hier fünfzig Prozent) komprimieren und die alten Versionen überschreiben:

Von der Digikam (oder auch aus dem Internet) heruntergeladene Bilddateien haben zwar normalerweise das komprimierte JPG-Format, sind aber nicht besonders klein und natürlich wird der Fotograf seine Einstellungen sowieso so gesetzt haben, daß eine möglichst hohe Qualität bestehen bleibt, zu Lasten des Speicherplatzes. Kopiert man seine Dateien dann etwa in eine Bildergalerie, so brauchen sie bei einer Bildgröße von 4...5 Megapixel locker über ein Megabyte Speicherplatz (bzw. Bandbreite im Download...), obwohl man bei einer Kompression auf ein Viertel Megabyte keinen Unterschied sehen würde. Alle Bilder öffnen, um sie nur wegen der Kompression mit einem Bildbearbeitungsprogramm zu bearbeiten, ist viel zu viel Arbeit. Ein typischer Einsatzfall für ImageMagick. Mit dem nachstehenden Befehl wurde ein Testbild von 1.016.104 Bytes aus der Kamera auf 336.051 Bytes verkleinert - ohne, daß man den Unterschied sah.
Befehl: mogrify -quality 50 *.jpg
Haben wir von Bildschirmabdrucken oder bestimmten Programmen noch .png-Dateien (unkomprimierte Bilder) im Verzeichnis? Vorher den Befehl anwenden:
mogrify -format jpg *.png

und sie sind alle in .jpg umgewandelt.
rm *.png

befreit uns dann noch von den Originalen. (Vorsicht, ein kleiner Tippfehler, etwa nur das Sternchen ohne .png dahinter, löscht stattdessen alles in diesem Verzeichnis).

Ein Bild beschriften, das Original unverändert lassen und die beschriftete Version unter anderem Dateinamen abspeichern

ImageMagick - Copyrightvermerk

"Mogrify" ist der Befehl, um viele Dateien zu ändern und mit der neuen Version zu überschreiben. Bei Convert bezieht sich der Befehl auf eine Datei, und der Output kann in eine andere Datei geschrieben werden. Die Aufgaben lassen sich bei beiden auch kombinieren, z.B. in einem Arbeitsgang verkleinern und komprimieren.
Befehl: convert -pointsize 15 -fill gray -gravity SouthWest -draw "text 10,20 'Copyright Hannes Birnbacher'" 100_0729.jpg hemmerich.jpg
Anmerkung: convert ist der Universalbefehl für ziemlich alles.

Aus mehreren Bildern eines zusammensetzen (Tableau)

ImageMagick Tutorial Montage


Befehl:
 montage eins.jpg zwei.jpg drei.jpg vier.jpg -geometry +2+2 -resize 270x270  -frame 5  montiert.jpg
Dieser Befehl macht aus vier Bildern beliebiger Größe ein fünftes, hier montiert.jpg genannt. Die Optionen kann man weglassen, dann treten Defaults ein.
-geometry +2+2 (keine extra Leerstelle reinflicken!) legt fest, daß zwei Bilder nebeneinander und zwei Reihen übereinander erscheinen.
 -resize 270x270 bewirkt, daß die Bilder nicht den Default von 128 Pixel Breite einnehmen, sondern nur auf eine höchste Breite oder Höhe von 270 Pixel verkleinert werden.
-frame 5 macht einen 5 Pixel breiten Rahmen mit der Default-Farbe grau.

Nur zwei Bilder (z.B. zwecks eines Vergleichs) aneinanderfügen:

montage Bild1.JPG Bild2.JPG -geometry +2+1  -frame 5  Ergebnis.jpg

Bemerkung: Man experimentiere auch mit "-bordercolor white" etc. und mit "border" statt "frame".
Beispiel: Für eine Auktion darf ich nur eine Bilddatei hochladen, ich will aber mehrere kleinere Ansichten eines Gegenstandes zeigen.

Alternativ: Bilder nebeneinander anordnen
convert bild1.png bild2.png +append nebeneinander.png

Bilder nebeneinander anordnen

convert bild1.png bild2.png -append untereinander.png


Ein PDF in eine JPG-Bilddatei verwandeln:

convert -density 300 input.pdf output.jpg


Mehrere PDF-Datei zu einer zusammenstückeln:

convert entreunosyceros-1.pdf entreunosyceros-2.pdf archivos_combinados_convert.pdf


Das geht auch für einzelne Seiten:

convert entreunosyceros-1.pdf[4] entreunosyceros-2.pdf[6,9] paginas_combinadas_convert.pdf

oder Seitenbereiche:

convert entreunosyceros-1.pdf[0-4] entreunosyceros-2.pdf[0-9] rango_paginas_combinadas_convert.pdf


Ränder aller Bilder in einem Verzeichnis wegschneiden

convert *.jpg -shave [Seiten]x[oben/unten]  shavedall.jpg


Beispiel: convert *.jpg -shave 125x44 -set filename:f '%t' ../Output/'%[filename:f].jpg'


In dem Beispiel sind unter /media zwei Unterverzeichnisse eingerichtet, nämlich "Bearbeiten" (hier nicht sichtbar, da in dieses cd-t wurde) und "Output".

Das Beispiel wird links und rechts je (!) 125 Pixel abschneiden, oben und unten 44 Pixel. Es wird alle Ausgangsdateien in dem Verzeichnis bearbeiten, die mit .jpg enden, und die beschnittenen Ergebnisse in dem Verzeichnis "../Output speichern. Die beschnittenen Ergebnisse haben denselben Dateinamen wie die Ausgangsdatei.

The option -set filename:f '%t' sets the property filename:f to the current filename without the extension. Properties beginning with filename: are a special case that can be referenced in the output filename. Here we set it to ../'%[filename:f].jpg, which ends up being the image filename with the extension replaced with .jpg in the parent directory.

Tipp: Um die Größe der wegzuschneidenden Ränder zu ermitteln, ruft man die Bilddatei mit einem Bildbearbeitungsprogramm auf und wendet die Funktion "Beschneiden", wie auch immer sie in dem gewählten Programm heisst, an, natürlich ohne Abspeicherung. Beispiel: das Originalbild ist 1280 Pixel breit. In der Funktion ist das beschnittene Innenbild mit 1030 Pixel angezeigt, also 250 Pixel weniger breit. Also muss man 250 Pixel abschneiden lassen. "-shave" kann nur immer gegenüberliegende Bildseiten um den gleichen Betrag kürzen, somit ist die Hälfte von 250 Pixel als erster Parameter zu "shave" einzusetzen, bezüglich der Höhe entsprechend.


Aus einer PDF-Datei alle Fotos herausziehen:

pdfimages -j Pdfdatei.pdf ./


Exif-Datum auch als Dateidatum einsetzen:

Nach dem Überspielen von Kamera auf den PC als auch nach jeder Bildbearbeitung wird das Datum der letzten Bearbeitung als Dateidatum gespeichert. Möchte man in einem Verzeichnis und allen Unterverzeichnissen das Aufnahmedatum als Dateidatum da stehen haben, hilft der Befehl:

exiftool -r '-DateTimeOriginal>FileModifyDate' * -overwrite_original .

Einzeln kann man das bewerkstelligen mit touch -t JJJJMMDD0000 Dateiname.

Exif-Datum korrigieren:

Z.B. Sommerzeitumstellung vergessen? Dieser Befehl erhöht die abgespeicherte Aufnahmezeit bei allen Bildern im Verzeichnis um eine Stunde. Jahr:Monat:Tag wurden mit Null belassen, wie sie waren, hinter der "1" für die Stunde die Minute:Sekunde ebenfalls.

exiftool -P -alldates+='0:0:0 1:0:0' -overwrite_original ./


Die Exif-Daten aus einer Bilddatei löschen:

exiftool -all= DATEINAME.JPG 


Im akuellen Verzeichnis und allen dessen Unterverzeichnissen einen Copyrightvermerk in allen Bilddateien eintragen:

exiftool -r -Copyright="Dies-wird-der-Copyrightvermerk"-overwrite_original ./

Weitere Felder, die sich zur globalen Bearbeitung mit Exiftool anbieten, wäre UserComment, bei Fotoxx "Kommentar" genannt, um etwa in alle Bilder einer Aufnahmeserie das gleiche Event (wie "ILA Berlin 2014") einzutragen, oder Caption, bei Fotoxx "Titel" genannt, wenn alle Bilder in einem Verzeichnis denselben Aufnahmegegenstand zeigen (wie "Airbus A-380").

Bei allen Aktionen mit Exiftool sollte man dahintersetzen:

-overwrite_original 
um nicht die lästigen Sicherheitskopien auf der Platte zu haben.

Ist es dennoch passiert? (Gilt natürlich für alle Dateien, die man global nicht haben oder die man suchen wollte!)

Alle Dateien löschen, die im Namen einen bestimmten Begriff haben:

Erst einmal zur Kontrolle anzeigen lassen: find ./ -name '*SUCHSTRING'
und dann (Vorsicht, gefährlich), hier schon mit dem "_original" als Suchstring eingesetzt:
find ./ -name '*_original' -delete
Hiermit wird ohne Rückfrage alles gelöscht, was den Suchstring enthält (gibt man diesen also falsch oder gar nicht ein, wird die gesamte Platte gelöscht).

Alle Unterverzeichnisse mit einem bestimmten Namen auf der gesamten Platte löschen:

Mit dieser radikalen Funktion von "find" habe ich die Unterverzeichnisse ".thumbnails" löschen können, die mir das Programm "fotoxx" in der Voreinstellung ungewollt auf der gesamten Festplatte in jedem Verzeichnis angelegt hat, in dem sich Fotos befunden haben.
Unbedingt zuerst den Test mit der reinen Suchfunktion (nach dem Typ "Directory", also -d) laufen lassen:

find . -name .SUCHBEGRIFF -type d

Und hiernach kann man die Löschfunktion anhängen, wenn man sich traut:

find . -name .svn -type d -exec rm -r {} \;



Tipp: Unter Linux RAW-Dateien alle auf einmal in JPG-Dateien konvertieren

Ich habe das mit Geequie gemacht. Zuerst einmalig UFRAW in einem Terminal mit einem Raw-Bild als Parameter aufgerufen, unter links "Sichern" eingestellt "JPEG" (und andere evtl. gewünschte Ausgabeparameter), bei rechts unten "Optionen" auf "Konfiguration sichern" klicken.

Dann für UFRAW in Geequie dieTastenkombination, bei mir Ctrl-2, zugewiesen.

Jetzt eine Bilddatei oder mit Ctrl+a alle Bilddateien im Verzeichnis markieren, Ctrl-2 gedrückt und alle Bilddateien werden nacheinander konvertiert.


zurück zu "Computer"

Url dieser Seite: http://hannes-birnbacher.de/computer/imagemagick.html
Kurzlesezeichen: http://tinyurl.com/5syjo5