Home / LinuxUser / 2011 / 10 / Bildverarbeitung mit den Skriptsprachen Perl und Python

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Debian leicht gemacht
(161 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.

Mehr Motorkraft

Bildverarbeitung mit den Skriptsprachen Perl und Python

Daten auslesen

Mit Listing 8 steht eine generische Schnittstelle zum Rotieren von Bildern bereit, die beliebige Drehwinkel ermöglicht. Im Alltag reduziert sich das häufig auf die Notwendigkeit, Bilder korrekt im Quer- oder Hochformat anzuzeigen. Viele Programme werten dazu bereits Zusatzinformationen in den Bildern aus und stellen das Bild entsprechend gedreht dar. LinuxUser stellte dazu bereits die Möglichkeiten von Geeqie (Abbildung 3) vor [13].

Abbildung 3

Abbildung 3: Gqview/Geeqie stellt das Bild und dessen Exif-Daten dar.

Diese Zusatzinformationen zu den Aufnahmen stehen oft im Exchangeable Image File Format (Exif, [14]) bereit und beinhalten beispielsweise die Auflösung des Bildes, den Kamerahersteller und das Modell, den Farbraum, die genutzten Filter und Objektive sowie die Orientierung für Hoch- oder Querformat [15]. Dabei unterstützen die Kameras nur die Formate JPEG, TIFF (Rev. 6) und RIFF WAV, die Formate PNG und GIF bleiben bislang außen vor.

Viele Beispiele im Netz zeigen den erfolgreichen Zugriff auf die Exif-Daten mit dem speziellen PIL-Modul ExifTags. Diese Information scheint für aktuelle PIL-Versionen veraltet zu sein, denn das Auslesen gelang damit nicht. Die Alternative Pyexiv2 [16] lieferte hingegen Ergebnisse. Das Modul stellt eine Schnittstelle für die C++-Bibliothek Exiv2 bereit.

Als vollständiges Beispiel zum Auslesen der Exif-Daten dient Listing 9: Nach dem Laden des Bildes (Zeile 14) erfolgt das Lesen der Exif-Daten mit der Methode readMetadata (Zeile 15). Eine Liste der gefundenen Metatags liefert die Methode exifKeys (Zeile 16). In Zeile 18 gibt das Skript die Liste zusammen mit den gespeicherten Metadaten aus. Es akzeptiert als einzigen Parameter eine Datei im JPG- oder TIFF-Format, beispielsweise aufgerufen wie in Listing 10.

Listing 9

# exif.py
# -*- coding: utf-8 -*-
# Module System und Pyexiv2 laden
import sys
import pyexiv2
kommandozeile = sys.argv[1:]
dateiname = kommandozeile[0]
print ("Datei: %s" % dateiname)
try:
  bild = pyexiv2.Image(dateiname)
  bild.readMetadata()
  info = bild.exifKeys()
  for key in info:
    print ("%s: %s" % (key, bild[key]))
except IOError:
  print ("Fehler: kann %s nicht bearbeiten" % dateiname)

Listing 10

$ python exif.py IMG_0284.JPG
Datei: IMG_0284.JPG
Exif.Image.Make: Canon
Exif.Image.Model: Canon PowerShot A470
Exif.Image.Orientation: 1
Exif.Image.DateTime: 2008-09-14 11:05:50
Exif.Photo.PixelXDimension: 2048
Exif.Photo.PixelYDimension: 1536
...

Die Liste und Werte der Exif-Tags variieren und hängen von der Kamera selbst, deren Firmware und den Kamera-Einstellungen ab (siehe dazu das Interview mit Phil Harvey [17], dem Entwickler von Exiftool).

Die Ausgabe in Listing 10 verrät, dass das Bild mit einer Canon Powershot A470 am 14. September 2008 kurz nach 11 Uhr aufgenommen wurde (genauer: die Kamera hat diesen Zeitstempel eingetragen). Das Bild hat eine Breite von 2048 Pixel und eine Höhe von 1536 Pixel.

Die Zeile Exif.Image.Orientation mit dem Wert 1 besagt, dass die Aufnahme im Querformat vorliegt. Gemäß [18] sind auch die Werte in Tabelle "Ausrichtungsoptionen" gültig. Eine Kamera ermittelt die Ausrichtung über einen Lagesensor, mittels dessen sie erkennt, ob Sie gerade im Hoch- oder Querformat aufnehmen. Demgemäß setzt sie den entsprechenden Wert in den Exif-Daten. Verfügt das Aufnahmegerät über keinen solchen Sensor, trägt es bei allen Aufnahmen eine 1 ein, geht also vom Querformat aus.

Ausrichtungsoptionen

Option Bedeutung Winkel
1 Querformat, Nullpunkt oben links Drehen um 0 Grad
3 Querformat, Nullpunkt unten rechts Drehen um 180 Grad
6 Hochformat, Nullpunkt oben rechts Drehen um 90 Grad
8 Hochformat, Nullpunkt unten links Drehen um 270 Grad

Nach Exif-Daten drehen

Als letztes Beispiel dient ein Skript, welches das Bild so dreht, wie es sich der Fotograf bei der Aufnahme gedacht hat. Die Grundlage dazu liefern die Exif-Daten, die den notwendigen Drehwinkel verraten. Dazu kombiniert der Code in Listing 11 Funktionen aus PIL und Pyexiv2.

Nach dem Vorspann (Zeile 1 bis 8) und dem Auswerten der Parameter (Zeile 9 bis 13) liest das Skript die Exif-Daten aus der Bilddatei aus (Zeile 16 bis 19).Interessant ist der Eintrag Exif.Image.Orientation, dessen Wert in der Variable ausrichtung landet (Zeile 19). Zeile 21 enthält eine Liste mit Einträgen, die jedem Wert der Ausrichtung den entsprechenden Drehwinkel zuordnet. Dabei fungiert der Wert der Ausrichtung als Index in der Liste.

Falls die Ausrichtung einen Wert größer "1" beinhaltet, gilt es, das Bild entsprechend zu drehen. In den Zeilen 27 bis 29 erledigt die PIL-Methode rotate das Rotieren des Bildes. Dabei gehen im neuen Bild zunächst die Exif-Daten verloren. Deswegen überträgt das Skript diese in den Zeilen 31 bis 45 aus dem alten Bild ins neue. Dazu kopiert es die Werte des Ursprungsbildes zunächst vollständig in die Datenstruktur des neuen Bildes (Zeilen 33 bis 38).

Liegt ein Bild im Hochformat vor, bedürfen alle achsenbezogenen Werte einer Korrektur, also Höhe und Breite des Bildes sowie die Auflösung und Ausrichtung. Schließlich speichert das Skript das Ergebnis in Zeile 45 in der neuen Datei.

Listing 11

# exif2.py
# -*- coding: utf-8 -*-
# Module System, PIL und Pyexiv2 laden
import sys
import pyexiv2
import Image
kommandozeile = sys.argv[1:]
dateiname = kommandozeile[0]
ausgabedatei = kommandozeile[1]
print ("Datei: %s" % dateiname)
try:
  bild = pyexiv2.Image(dateiname)
  bild.readMetadata()
  info = bild.exifKeys()
  ausrichtung = bild['Exif.Image.Orientation']
  zuordnung = {1: 0.0, 3: 180.0, 6: 90.0, 8: 270.0}
  drehwinkel = zuordnung[ausrichtung]
  print ("Ausrichtung: %i" % ausrichtung)
  print ("Drehwinkel: %f Grad" % drehwinkel)
  if ausrichtung > 1:
    neuesbild = Image.open(dateiname)
    neuesbild = neuesbild.rotate(drehwinkel)
    neuesbild.save(ausgabedatei)
    neuesbild = pyexiv2.Image(ausgabedatei)
    neuesbild.readMetadata()
    for key in info:
      try:
        neuesbild[key] = bild[key]
      except:
        print ("Konvertierungsfehler bei Eintrag %s" % key)
    neuesbild['Exif.Image.Orientation'] = 1
    if ausrichtung > 5:
      neuesbild['Exif.Image.XResolution'] = bild['Exif.Image.YResolution']
      neuesbild['Exif.Image.YResolution'] = bild['Exif.Image.XResolution']
      neuesbild['Exif.Photo.PixelXDimension'] = bild['Exif.Photo.PixelYDimension']
      neuesbild['Exif.Photo.PixelYDimension'] = bild['Exif.Photo.PixelXDimension']
    neuesbild.writeMetadata()
    print ("Ausgabedatei: %s" % ausgabedatei)
except IOError:
  print ("Fehler: kann %s nicht bearbeiten" % dateiname)
Tip a friend    Druckansicht Bookmark and Share
Kommentare

Hits
Wertung: 166 Punkte (15 Stimmen)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

LinuxUser 05/2014

Aktuelle Ausgabe kaufen:

Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,95 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 60,60) können Sie im Medialinx-Shop bestellen.

Tipp der Woche

Bilder vergleichen mit diffimg
Bilder vergleichen mit diffimg
Tim Schürmann, 01.04.2014 12:40, 1 Kommentare

Das kleine Werkzeug diffimg kann zwei (scheinbar) identische Bilder miteinander vergleichen und die Unterschiede optisch hervorheben. Damit lassen sich nicht nur Rätsel a la „Orignial und Fäls...

Aktuelle Fragen

programm suche
Hans-Joachim Köpke, 13.04.2014 10:43, 8 Antworten
suche noch programme die zu windows gibt, die auch unter linux laufen bzw sich ähneln sozusagen a...
Funknetz (Web-Stick)
Hans-Joachim Köpke, 04.04.2014 07:31, 2 Antworten
Bei Windows7 brauche ich den Stick nur ins USB-Fach schieben dann erkennt Windows7 Automatisch, a...
Ubuntu 13.10 überschreibt immer Windows 8 Bootmanager
Thomas Weiss, 15.03.2014 19:20, 8 Antworten
Hallo Leute, ich hoffe das ich richtig bin. Ich habe einen Dell Insipron 660 Ich möchte gerne Ub...
USB-PTP-Class Kamera wird nicht erkannt (Windows-only)
Wimpy *, 14.03.2014 13:04, 15 Antworten
ich habe meiner Frau eine Digitalkamera, AGFA Optima 103, gekauft und wir sind sehr zufrieden dam...
Treiber
Michael Kristahn, 12.03.2014 08:28, 5 Antworten
Habe mir ein Scanner gebraucht gekauft von Canon CanoScan LiDE 70 kein Treiber wie bekomme ich de...