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

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

„Klickbunt auf dem Server? Warum nicht, wenn's hilft!"
(208 Punkte bei 7 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

Bildinformationen

Listing 6 gleicht von den Zielen her Listing 1. Das Skript gibt die Informationen zu einer Bilddatei auf der Standardausgabe aus (Abbildung 2). Die Namen der Bilddateien erhält das Skript als Parameter im Aufruf.

Abbildung 2: Mit nur wenigen Zeilen Python zaubern Sie Metainformationen aus Bilddateien heraus.

Listing 6

# bildinfo.py
# -*- coding: utf-8 -*-
# Module System und PIL laden
import sys
import Image
kommandozeile = sys.argv[1:]
for dateiname in kommandozeile:
  print ("Datei: %s" % dateiname)
  try:
    bild = Image.open(dateiname)
    print ("Format: %s" % bild.format)
    print ("Größe: %s x %s" % (bild.size[0], bild.size[1]))
    print ("Modus: %s" % bild.mode)
    print (" ")
  except IOError:
    print ("Fehler: kann %s nicht lesen" % dateiname)

Nach Angabe des verwendeten Encodings in Zeile 1 (hier UTF-8) gilt es, die beiden zusätzlichen Python-Module sys und Image zu laden (Zeilen 5 und 6). Danach wertet das Skript in Zeile 8 die Aufrufzeile aus. Das Konstrukt sys.argv[1:] übernimmt alle übergebenen Parameter der Aufrufzeile als Liste, mit Ausnahme des ersten Parameters: Dieser enthält den nicht benötigten Namen des Skriptes.

In der For-Schleife in Zeile 10 arbeitet das Skript die Liste der Parameter einzeln ab, wobei jeder Parameter den Dateinamen einer Bilddatei repräsentiert. Nach der Ausgabe des Dateinamens (Zeile 11) folgt das Laden des Bildes mit der Methode open() (Zeile 13). Die Variable bild ist ein Objekt der Klasse Image mit den Attributen format (Bildformat), size (Breite und Höhe des Bildes) und mode (Farbmodus). Die Werte der Attribute liest das Skript aus der Variablen bild und gibt sie danach auf der Standardausgabe aus (Zeilen 14 bis 16).

Das ganze Konstrukt ist in eine Struktur eingebettet (try/except), um auftretende Fehler beim Ablauf abzufangen. Enthält die Variable dateiname beispielsweise keine Bilddatei oder vermag das Skript die angegebene Bilddatei nicht zu lesen, überspringt es die Ausgabe der Bilddetails und gibt ein Fehlerhinweis auf der Standardausgabe aus (Zeile 19).

Bilder drehen

Für das Drehen von Bildern beinhaltet die PIL-Klasse die beiden Methoden rotate und transpose. Während rotate das Drehen um einen beliebigen Winkel gestattet, bringt transpose feste Winkel und die Transformationen um die horizontale und vertikale Bildachse mit. In Bezug auf die Ausführungsgeschwindigkeit und die Qualität der Transformation besteht kein Unterschied zwischen beiden Methoden. Nachfolgend kommt rotate zum Einsatz.

Als einzigen Parameter benötigt rotate den Drehwinkel als Fließkommazahl. Listing 7 zeigt das Drehen eines Bildes um 45 Grad im Uhrzeigersinn. Zeile 1 enthält die Instruktionen zum Öffnen der Datei in Form eines Objekts der Image-Klasse. Dieses landet in der Variable bild.

Zeile 2 definiert eine Variable drehwinkel, die den Fließkommawert 45.0 zugewiesen bekommt. In Zeile 3 erfolgt das Drehen des Bildes über den Aufruf der Methode rotate der Variable bild. Den gewünschten Drehwinkel übergeben Sie einfach als Parameter. In Zeile 4 landet das gedrehte Bild in der angegebenen Datei – bei der Abfolge im Beispiel in der Originaldatei.

Listing 7

bild = Image.open(dateiname)
drehwinkel = 45.0
bild.rotate(drehwinkel)
bild.save(dateiname)

Listing 8 behebt diesen Makel und zeigt das Drehen eines Bildes in einem kompletten Python-Skript. Sie rufen es wie folgt auf:

$ python bilddrehen.py Drehwinkel Eingabedatei Ausgabedatei

Das Skript erwartet die Parameter exakt in dieser genannten Reihenfolge. Für das Drehen des Bildes um 45 Grad im Uhrzeigersinn sieht der Aufruf so aus:

$ python bilddrehen.py 45.0 bild.png bild-gedreht.png

Nach dem Python-Vorspann (Zeile 1 bis 7) wertet das Skript den Aufruf aus. Zunächst liest es die Parameter aus und weist diese den drei internen Variablen drehwinkel, dateiname und ausgabedatei zu (Zeile 8). Es lohnt sich sicherzustellen, dass der Drehwinkel eine Fließkommazahl ist (Zeile 9). Das geschieht, indem Sie den im Parameter übermittelten Wert für den Drehwinkel mittels float() explizit in eine Fließkommazahl umwandeln. Die Zeilen 11 bis 13 geben die Werte für die zu bearbeitende Datei, den Drehwinkel und die Ausgabedatei aus.

In den Zeilen 15 bis 20 erfolgt das Rotieren: Erst öffnet das Skript die Bilddatei (Zeile 16), dreht sie dann um den gewünschten Winkel (Zeile 17), legt anschließend das veränderte Bild in der Variable neuesbild ab und speichert das Resultat schließlich in der Ausgabedatei (Zeile 18). Eine bestehende Ausgabedatei mit gleichem Namen überschreibt es ohne Rückfrage. Tritt beim Bearbeiten ein Ein-/Ausgabefehler auf, greift das Try-Except-Statement: Es fängt den Fehler ab und gibt ihn aus (Zeile 20).

Listing 8

# bilddrehen.py
# -*- coding: utf-8 -*-
# Module System und PIL laden
import sys
import Image
(drehwinkel, dateiname, ausgabedatei) = sys.argv[1:]
drehwinkel = float(drehwinkel)
print ("Drehwinkel: %f Grad" % drehwinkel)
print ("Datei: %s" % dateiname)
print ("Ausgabedatei: %s" % ausgabedatei)
try:
  bild = Image.open(dateiname)
  neuesbild = bild.rotate(drehwinkel)
  neuesbild.save(ausgabedatei)
except IOError:
  print ("Fehler: kann %s nicht bearbeiten." % dateiname)
Einem Freund empfehlen    Druckansicht Bookmark and Share
Kommentare

Hits
Wertung: 144 Punkte (10 Stimmen)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

title_2013_06

Aktuelle Ausgabe kaufen:

Heft bestellen 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

Terminator
Viele Terminals im Griff mit Terminator
Tim Schürmann, 07.05.2013 10:57, 1 Kommentare

Wer morgens nach dem Einschalten des Rechners erst einmal mehrere Terminals öffnet und sich diese mühevoll auf dem Bildschirm drapiert, der sollte einen Blick auf Terminator werfen. Das kleine...

Aktuelle Fragen

Kontakt via QR code hinzufügen
Herman Sproesser, 17.05.2013 17:46, 3 Antworten
Hi hab in der aktuellen ausgabe 06.2013 den artikel über QR Codes gelesen. Ich hab nartürlich...
Dateimanager Dolphin, wo legt er die Datei Kommentare ab?
Uwe Heine, 16.05.2013 15:19, 1 Antworten
Suse Linux 12.1 - KDE 4.7.2 / Dolphin 1.7. Ich habe bei vielen Dateien über Dolphin Kommentare...
wie baut man Kernel Module so, dass sie mit jedem Kernel laden?
GoaSkin , 22.04.2013 10:22, 1 Antworten
Hallo, baut man anhand eines Kernel-Sources Module, nutzt Linux im Normalfall eine strikte V...
Problem beim Installieren von SuSe 12.3
Georg Prokert, 14.04.2013 00:04, 16 Antworten
Hallo, auf meinem neuem Laptop (Acer Aspire V3-771, Intel Core i5-3230 M, Intel HD Graphics 4...
lvm wieder loswerden
Peter Dibbern, 11.04.2013 16:28, 4 Antworten
Ich habe sämtliche alten Kisten ausgeschlachtet und aus der Teilen einen Rechner zusammengeschrau...