Skriptgesteuerte Bildverarbeitung
Stand: Januar 2007
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 Werkzeug convert
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.
-
jhead
nutzt zum rotieren das Werkzeugjpegtran
, welches verlustfreie jpeg-Transformationen unterstützt und korrigiert den Orientation -Tag - die Option
-ft
setzt 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 ...
-
identify
kann 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
-
convert
erhä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
und hier das Vorschaubild
$ 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
-
convert
dreht Bilder auf Pixelebene, d.h. es erfolgt eine Re-Kodierung des Inhalts
$ convert -rotate 90 infile.jpg rot_outfile.jpg
rotiert
-
jpegtran
arbeit nur mit jpeg-Format, dafür aber verlustfrei und deutlich schneller ¹)
$ jpegtran -rotate 90 infile.jpg > rot_outfile.jpg
¹) im Vergleich zu 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-Werkzeug convert
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
Die restlichen Ecken müssen analog hergestellt werden (z.B. durch Drehen der Vorlage).
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
... oder rekursiv in Unterverzeichnissen:
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
-
convert
kann mehrseitige PDF-Dokumenten in einzelne Bitmapgrafiken zerlegen. - Auflösung kann über den Paramter
density
festgelegt werden, Standard 72dpi
$ convert -density 300 infile.pdf pages-%04d.png
-
pdfimages
aus 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-scale
mö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:transparent
erzeugt 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
-
+antialias
deaktiviert 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
-
-matte
fü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
Links
- ImageMagick
- jhead
- Independent JPEG Group (jpegtran)
- iimage
- ImageMagick Beispiele
- ImageMagick Tutorial (IBM)
- ImageMagick Tutorial (IBM)