Springe zum Hauptinhalt

Skriptgesteuerte Bildberarbeitung

Skriptgesteuerte Bildverarbeitung


Kursinhalt:

Stand: Januar 2007


Motivation

  • mehrere (viele) Bilder im Stapel bearbeiten
  • häufig wiederkehrende Prozesse automatisieren
  • Verarbeitung in Skripten
  • Kommandozeile ist schneller smile

Behandelte Werkzeuge sind größtenteils Bestandteil des ImageMagick -Paketes.


Bildformate

Überblick

Der Kurs beschäftigt sich ausschließlich mit Rastergrafiken (auch als Pixelgrafik bzw. Bitmaps bezeichnet).

Beachte: Operationen an Rastergrafiken sind i.A. nicht umkehrbar!

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

Von ImageMagick unterstützte Formate sind im Manual gelistet. 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 Werkzeug jpegtran, 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

IMG_0652.JPG und hier das Vorschaubild thumb_IMG_0652.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
  • convert dreht Bilder auf Pixelebene, d.h. es erfolgt eine Re-Kodierung des Inhalts

$ convert -rotate 90 infile.jpg rot_outfile.jpg

IMG_0516.JPG rotiert rot_IMG_0516.JPG

  • 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

text_IMG_0652.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

charcoal_IMG_0516.JPG   solarize_IMG_0516.JPG   spread_IMG_0516.JPG

Rahmen

  • verzieren von Bilder, z.B. für eine Webgallery
  • Darstellung von Schaltflächen

erhabene Rahmen

$ convert  -raise 20x20 infile.jpg outfile.jpg

Probier mal die Option +raise 20x20

farbige Rahmen

$ convert -bordercolor "BlueViolet" -border 20x20 infile.jpg outfile.jpg

Verfügbare Farbnamen zeigt das Kommando: convert -list color

$ convert -mattecolor "grey21" -frame 50x50+15+15 infile.jpg outfile.jpg

raise_IMG_0516.JPG   border_IMG_0516.JPG   frame_IMG_0516.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

preview_ecke_ro.png

$ composite -gravity NorthEast ecke_ro.png infile.jpg outfile.jpg

roundet_IMG_0516_1.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

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

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