de:sysadmin:tools:imagemagick

ImageMagick, Exiftran, Exiftool & Co - Bildverarbeitung mit der Kommandozeile

Syntax von convert und mogrify sind (fast) gleich, convert macht eine dementsprechend geänderte Kopie, mogrify ändert das Original. Bildinformationen kann man sich mit identify anzeigen lassen

  • exiftool
    • Das umfangreichste reine EXIF-Werkzeug, das ich kenne
    • Kommandozeileninterface zur Perl-Bibliothek Image::ExifTool, kann man zum Lesen und Schreiben von Meta-Informationen in Bilder, Audio- und Video-Dateien verwenden
  • exiftran
    • Kann u.a. Bilder gleich automatisch richtig drehen (nach dem EXIF-Orientation-Tag (falls die Kamera einen Ausrichtungs-Sensor hat))

umbenennen nach Erstellungs-Datum

exiftool -ext jpg -FileName'<DateTimeOriginal' -d %Y%m%d_%H%M%S.jpg Dir

Benennt alle Bilder mit Dateierweiterung jpg im Verzeichnis Dir nach Erstellungsdatum und Uhrzeit um - falls die Uhrzeit der Kamera richtig eingestellt war.

Falls die Uhrzeit nicht richtig war, kann man dies den Bildern vorher beibringen: z.B. 1 Stunde und 50 Minuten abziehen:

exiftool -ext jpg exiftool -DateTimeOriginal-='0:0:0 1:50:0' Dir

(Quelle: exiftool Manpage)

drehen

Bild um 90 Grad rotieren (im Uhrzeigersinn):

mogrify -rotate 90 bild.jpg

http://www.imagemagick.org/script/command-line-options.php#rotate

Bei Kameras mit eingebauten "Ausrichtungssensor" geht das auch einfacher mit exiftran:

exiftran -a -i bild.jpg

exif-tags

anzeigen

exiftool bild.jpg

setzen (hier überschreiben), keine Backupkopie

exiftool -overwrite_original -Keywords="Skippertraining2006"

exif-tags aus Text-Dateien setzen ...

hier hatte ich ein paar Fotos und einen beschreibenden Text in einer Textdatei. (Die Dateien waren bis auf die Endung gleich benannt). Ziel: Beschreibenden Text in die jpg-Datei selber schreiben

DATEIEN=`ls p*txt | awk -F. '{print $1}'`
for f in $DATEIEN;do sudo exiftool "-Caption-Abstract<=$f.txt" -r $f.jpg;done

Eingebettete Vorschaugrafik aus dem Bild entfernen

… auch Kleinvieh macht Mist, wenn man die Daumennägel nicht braucht, kann man sie auch entfernen (und die Dateien werden ohne anderweitigen Qualitätsverlust etwas kleiner)

mit exif:

for i in *.jpg;do exif --remove-thumbnail $i -o $i ;done

mit exiftool:

exiftool -b -ThumbnailImage= *.jpg

alle Exif-Infos aus dem Bild entfernen

exiftool -exif:all=  bild.jpg

2)

oder

mogrify -strip bild.jpg

3)

Bedingtes Verkleinern

convert -resize "800>x800>" bild.jpg bild.800.jpg

Verkleinert das Bild, falls eine Seitenlänge größer als 800 Pixel ist. Das Seitenverhältnis bleibt erhalten.

Ein Bild von 1704x2272 wird also auf 600x800 verkleinert, ein Bild von 2272x1704 auf 800x600, ein Bild mit 175x175 wird gar nicht verkleinert (oder vergrößert)

$ identify bild.jpg  kleinbild.jpg
bild.jpg JPEG 1704x2272 1704x2272+0+0 DirectClass 8-bit 1.54796mb 0.290u 0:02
kleinbild JPEG 175x175 175x175+0+0 DirectClass 8-bit 11.4453kb

$ for b in bild.jpg kleinbild.jpg; do convert -resize "800>x800>" $b x800.$b ; done

$ identify x800*
x800.bild.jpg JPEG 600x800 600x800+0+0 DirectClass 8-bit 294.68kb 0.040u 0:02
x800.kleinbild.jpg JPEG 175x175 175x175+0+0 DirectClass 8-bit 10.9883kb

weisse Rechtecke erzeugen in variabler Größe

for d in 30 40 50 75 80 100 120 150 200 ; do
convert -size ${d}x${d} xc:none -fill white -draw "rectangle 0,0 $d,$d" weiss.${d}x${d}.png
done

transparenten Hintergrund einfärben

Der Trick: nicht den Alpha-Channel wegwerfen (dann werden halbtransparente Kanten hässlich), sondern einfach ein weisses Rechteck hinter das original legen

$ identify logo.bg-transparent.png
logo.bg-transparent.png PNG 150x200 150x200+0+0 DirectClass 16-bit 15.2476kb

$ X=150
$ Y=200
$ convert -size ${X}x${Y} xc:none -fill white -draw "rectangle 0,0 $X,$Y" weiss.${X}x${Y}.png
$ composite -compose atop logo.bg-transparent.png weiss.${X}x${Y}.png  logo.bg-weiss.png

Beispiel: Quadratische Bilder mit weiss hinterlegen:

for d in 30 40 50 60 75 80 100 120 150 200 250 300; do
convert -size ${d}x${d} xc:none -fill white -draw "rectangle 0,0 $d,$d" weiss.${d}x${d}.png
composite -compose atop logo.bg-transparent.${d}x${d}.png weiss.${d}x${d}.png  logo.bg-weiss.${d}x${d}.png
done

Bildgröße feststellen

Breite x Höhe:

$ identify  -format "%[fx:w]x%[fx:h]" bild.jpg
614x406

Breite (w für width):

$ identify  -format "%[fx:w]" bild.jpg 
614

Höhe (h für heigth):

$ identify  -format "%[fx:h]" bild.jpg 
406

Dateien umbenennen: Kamera-Name anhängen

Mist, mir sind (ungetaggte) RAW-Dateien (Olympus .orf) von verschiedenen Kameras durcheinandergeraten, bevor ich die Uhrzeiten angeglichen habe … wie sortiere ich die wieder auseinander?

Einfach den Kamera-Namen an den Dateinamen anhängen, geht so:

   for file in *orf; do
       cam=`exiftool -s -s -s -CameraType2 $file |tr '[:upper:]' '[:lower:]'`;
       echo ">>$file: $cam<<";
       name=`basename $file .orf`;
       mv $file $name.$cam.orf;
   done
1)
Wohl eine Demo für die Libexif-Bibliothek
2)
wichtig: hinter dem = kommt ein Leerzeichen
3)
die Verwendung für mogrify für das Entfernen von Exif-Infos habe ich dort gelesen: http://hacktux.com/read/remove/exif
de/sysadmin/tools/imagemagick.txt · Zuletzt geändert: 2019-09-26 13:15 von hella

Seiten-Werkzeuge

Mastodon Twitter