Skriptgesteuerte Bildverarbeitung
Kursinhalt:
Motivation
- mehrere (viele) Bilder im Stapel bearbeiten
- häufig wiederkehrende Prozesse automatisieren
- Verarbeitung in Skripten
- Kommandozeile ist schneller
Bildformate
Überblick
Der Kurs beschäftigt sich ausschließlich mit Rastergrafiken (auch als Pixelgrafik bzw. Bitmaps bezeichnet).Formate (Auswahl)
| Format | Name | Anmerkung |
|---|---|---|
| jpg/jpeg | Joint Photographics Expert Group | einstellbare,verlustbehaftete Kompression |
| png | Portable Network Graphics | indiziert, Graustufen, Echtfarben transparent, verlustfreie Kompression |
| gif | Graphics Interchange Format | indizierte Farben 8bit transparent animiert |
| tif/tiff | Tagged Image File Format | verschiedene Versione von tiff mehrere Ebenen möglich |
| xwd | X Windows Dump | Snapshot von xwd -Tool |
- Natürliche Bilder lassen sich gut im JPEG-Format speichern.
- Für Bilder mit scharfen Kontrastübergängen wie techn. Zeichnungen ist PNG besser geeignet.
- Die Kompressionsalgorithmen von JPG und PNG enthalten eine Lauflängenkompression.
Einen zusätzlich Kompression (z.B. ZIP) zeigt keine Wirkung.
Konvertieren von Bildformaten
Das Werkzeugconvert unterstützt die Konvertierung von/in verschiedene Bildformate. Diese werden automatisch erkannt. Die Steuerung des Ausgabeformates kann anhand der Dateierweiterung festgelegt werden.
$ convert infile.jpg outfile.png
$ cat infile.jpg | convert - jpg:outfile
man ImageMagick?
Bildinformationen
EXIF-Daten auswerten
- Exchangeable Image File Format
- Ablage für Informationen von Digitalkameras
$ jhead IMG_2836.JPG File name : IMG_2836.JPG File size : 752732 bytes File date : 2007:01:24 11:27:26 Camera make : Canon Camera model : Canon PowerShot S45 Date/Time : 2005:02:20 18:07:56 Resolution : 2272 x 1704 Flash used : Yes Focal length : 17.5mm (35mm equivalent: 89mm) CCD width : 7.11mm Exposure time: 0.017 s (1/60) Aperture : f/4.5 Metering Mode: matrix Jpeg process : Baseline
- Digitalkameras mit eingebauten Orientierungssensor setzten den EXIF-Tag Orientation. Damit lassen sich Bilder automatisch je nach Kameralage rotieren.
-
jheadnutzt zum rotieren das Werkzeugjpegtran, welches verlustfreie jpeg-Transformationen unterstützt und korrigiert den Orientation -Tag - die Option
-ftsetzt Timestamp des Bildes auf das Aufnahmedatum aus dem EXIF-Informationen
$ jhead -autorot -ft bild.jpg Cmd:jpegtran -rotate 90 -outfile "bild.JPt" bild.jpg Modified: bild.jpg
identify -Werkzeuge
Identifizieren von Bilder, z.B. zur Bestimmung der Dimensionen wird durch das Werkzeug identify unterstützt.
Das funktioniert für alle von ImageMagick unterstützten Formate. (ohne EXIF-Informationen)
$ identify -verbose outfile.jpg Image: outfile.jpg Format: JPEG (Joint Photographic Experts Group JFIF format) Geometry: 600x420 Class: DirectClass Colorspace: RGB Type: TrueColor Depth: 8 bits ...
-
identifykann auch formatierte Ausgabe für Skripte erzeugen - Formatierungszeichen: siehe Manual
man ImageMagick?
$ identify -format "%wx%h" outfile.jpg 600x420
Bildmanipulation
Vorschaubilder (thumbnails)
- Digitalkamera-Bilder sind meist "zu groß" für Bildübersichten bzw. Webseiten
- kleine Vorschaubilder erzeugt z.B. das Werkzeug
convert -
converterhält automatisch das Seitenverhältnis. D.h. die Vorschaubilder im Beispiel werden maximal 80x40 Pixel. - statt der Pixelgeometrie kann auch ein Verhältnis zum Original angegeben werden
$ convert -sample 80x40 infile.jpg outfile.jpg
$ convert -sample 12%x12% infile.jpg outfile.jpg
- EXIF-Daten können auch Thumbnails enthalten
$ jhead -st thumb_bild.jpg bild.jpg Created: 'thumb_bild.jpg'
Drehen
- als Portrait aufgenommene Bilder
-
convertdreht Bilder auf Pixelebene, d.h. es erfolgt eine Re-Kodierung des Inhalts
$ convert -rotate 90 infile.jpg rot_outfile.jpg
-
jpegtranarbeit nur mit jpeg-Format, dafür aber verlustfrei und deutlich schneller ¹)
$ jpegtran -rotate 90 infile.jpg > rot_outfile.jpg
convert mit jpeg-Bildformat
Texte
- Bildbeschreibungen, Aufnahmedatum, Copyright
$ convert -fill "white" -font "helvetica" -pointsize "54" \
-draw 'text 20,74 "Ein Bild von ..."' infile.jpg text_outfile.jpg
- Fontnamen werden über das Fontsystem des aktuellen X11-Displays aufgelöst. Verfügbare Fonts:
xlsfonts - Fonts können auch über Fontfiles spezifiziert werden. (bei Server-Skripten unbedingt erforderlich!)
$ INFO=$(identify -format "Dateiname: %f\nDateigröße: %b\nHöhe: %h\nBreite: %w" infile.jpg)
$ convert -fill "#343434" -font "$HOME/PRIVAT/fonts/waltograph42.otf" -pointsize "20" \
-draw "text 10,26 \"$INFO\"" infile.jpg text_outfile.jpg
Effekte
Das ImageMagick-Werkzeugconvert ist in der Lage, künstlerische Effekte wie von GIMP-Plugins bekannt, in Kommandozeilenform umzusetzen.
Kohlezeichnung
$ convert -charcoal 3 infile.jpg outfile.jpg
Solarisation
- negative Farbdarstellung, vergleichbar mit fotografischen Filmnegativen
$ convert -solarize 1 infile.jpg outfile.jpg
Unscharf
- Anordnung der Bildpunkte mit zufälliger Abweichung
$ convert -spread 20 infile.jpg outfile.jpg
Rahmen
- verzieren von Bilder, z.B. für eine Webgallery
- Darstellung von Schaltflächen
erhabene Rahmen
$ convert -raise 20x20 infile.jpg outfile.jpg
+raise 20x20
farbige Rahmen
$ convert -bordercolor "BlueViolet" -border 20x20 infile.jpg outfile.jpg
convert -list color
$ convert -mattecolor "grey21" -frame 50x50+15+15 infile.jpg outfile.jpg
abgerundete Ecken
Es gibt keine Funktion "abgerundete Ecken". Aber durch Überlagerung sollte auch das gelingen.- zunächst benötigt man eine "Vorlage" für eine abgerundete Ecke, das ist ein kleines, quadratisches Bild mit einer transparenten Rundung
- der Rest wird mit der gewünschten Hintergrundfarbe gefüllt, GIMP kann uns dabei helfen
$ composite -gravity NorthEast ecke_ro.png infile.jpg outfile.jpg
Einsatz von Skripts
ImageMagick? mit mehreren Operationen
Die ImageMagick-Werkzeuge können mehrere Operationen in einem Prozess ausführen. Die Reihenfolge der Optionen bestimmt die Verarbeitungsfolge.$ convert -sample 25%x25% -charcoal 2 -spread 4 infile.jpg outfile.jpg
Bearbeiten mehrerer Bilder
Dabei hilft uns die Shell:for i in *.JPG *.jpg *.png do echo "Bearbeite $i ..." convert -sample 25%x25% "$i" "thumb_$i" done
find . -type f -name "*.jpg" | while read i do echo "Bearbeite $i ..." convert -sample 25%x25% "$i" "$(dirname $i)/thumb_$(basename $i)" done
Tipps
Bilder aus PDF-Dokumenten extrahieren
-
convertkann mehrseitige PDF-Dokumenten in einzelne Bitmapgrafiken zerlegen. - Auflösung kann über den Paramter
densityfestgelegt werden, Standard 72dpi
$ convert -density 300 infile.pdf pages-%04d.png
-
pdfimagesaus dem xpdf-Paket extrahiert eingebettete Bilder aus PDF-Dokumenten
$ pdfimages infile.pdf bild
Bildergallerien im Web
Werkzeuge zum Erstellen von Bildergallerien für das Web gibt es viele. An dieser Stelle wird ein Skript vorgestellt, welches die im Kurs behandelten ImageMagick-Werkzeuge nutzt.Bilder skriptgesteuert erstellen
einfache geometrische Formen
-
xc:<color>eingebautes Bildformat, erzeugt ein Bild mit übergebener Farbe -
-size <Breite>x<Höhe>legt die Bildgröße fest (nachträgliches-scalemöglich) -
-fill <color>definiert die Füllfarbe für nachfolgende Elemente -
-stroke <color>definiert die Umrandung für nachfolgende Elemente
$ convert -size 300x400 xc:white \
-fill black -draw "line 30,30 270,70" \
-fill blue -draw "rectangle 30,100 130,250" \
-fill yellow -stroke black -draw "circle 220,130 220,170" \
-fill DarkOrange -draw "roundrectangle 180,200 270,250 30,10" \
-fill LightCyan2 -stroke none -draw "rectangle 50,280 250,370" \
-fill gray -stroke black -draw "arc 50,280 250,370 45,270 " \
-fill black -draw "text 255,325 '0°' text 150,385 '90°'" simple_geo.png
Buttons für's Web
-
xc:transparenterzeugt ein transparentes Bild (Alphakanal)
$ convert -size 300x85 xc:transparent \
-mattecolor "DeepSkyBlue" -frame 5x5+2+2 \
-fill DeepSkyBlue -stroke black -font /usr/share/fonts/ooffice/free_msfonts/comicbd.ttf \
-pointsize 40 -gravity center -draw "text 0,0 'Image Magick'" simple_text.png
Vorlage für eine abgerundete Ecke
-
+antialiasdeaktiviert Antialiasing -
-transparent <color>konvertiert die übergebene Farbe in Transparenz
$ convert -size 12x12 xc:white \
+antialias -fill black -draw "circle 0,12 12,12" -transparent black ecke_ro.png
$ convert -rotate 90 ecke_ro.png ecke_ru.png
-
-mattefügt dem Bild einen Alphakanal hinzu -
-compose <methode>definiert die Methode der Überlagerung
$ convert -size 12x12 xc:white \
\( -size 12x12 xc:none -fill black -draw "circle 0,12 12,12" \) \
-matte -compose Dst_Out ecke_ro.png