AA_motor_slulesoj_sxc_656726.jpg

© Slulesoj, sxc.hu

Mehr Motorkraft

Bildverarbeitung mit den Skriptsprachen Perl und Python

23.09.2011
Mit nur wenigen Zahlen Code korrigieren Sie das Format digitaler Bilder, passen die Metadaten an oder beschriften die Fotos für den Upload in ein Online-Album.

Serie "Automatische Bildverarbeitung"

Teil 1: ImageMagick, GraphicsMagick LU 03/2011, S. 84 http://www.linux-community.de/22947
Teil 2: Magick Scripting Language LU 06/2011, S. 84 http://www.linux-community.de/22948
Teil 3: Bearbeiten mit Perl/Python LU 07/2011, S. 90

In den ersten beiden Teilen der Artikelserie ([1],[2]) kamen die beiden Werkzeuge ImageMagick [3] und GraphicsMagick [4] zum Einsatz. In kleinere Shell-Skripte integriert, leisteten Sie dort gute Dienst. Zu beiden Werkzeugen gehören mächtige Bibliotheken, für die wiederum Bindings zu verschiedenen Programmiersprachen existieren.

Programmierschnittstellen

Wer also statt in der Shell zu arbeiten lieber seine Lieblingsprogrammiersprache zum Lösen der Aufgabe einsetzen möchte, dem stehen viele Möglichkeiten offen. Für ImageMagick und GraphicsMagick gibt es Schnittstellen unter anderem für C/C++, Perl, Java, Python, Ruby und Tcl. Diese sind erfreulicherweise vollständig, aktuell und verständlich dokumentiert.

In diesem Artikel drehen sich die Beispiele um die Bildmanipulation mit den beiden Skriptsprachen Perl und Python. Beide gehören zur Kategorie der Skriptsprachen. Vor dem Ausführen transponiert ein Interpreter den Programmcode in Bytecode. Das eigentliche Übersetzen erfolgt erst zur Laufzeit, sie brauchen im Vorfeld also nichts zu kompilieren. Das Binding für Perl heißt PerlMagick [5], das für Python PythonMagick [6].

Das erste Beispiel widmet sich PerlMagick. Das dafür erforderliche Debian/Ubuntu-Paket trägt den Namen libgraphics-magick-perl. Nach der Installation des Paketes binden Sie das Perl-Modul über die folgende Deklaration in ein Skript ein:

use Graphics::Magick;

Nun stehen die Klassen und Funktionen aus diesem Modul bereit. Der Code aus Listing 1 dient dazu, die Bildinformationen anzuzeigen. Die Namen der Dateien geben Sie dem Skript als Parameter beim Aufruf mit.

Listing 1

#!/usr/bin/perl -w
# bildinfo.pl - Bildinformationen anzeigen
# GraphicsMagick-Modul einbinden
use Graphics::Magick;
# Abbrechen, falls keine Dateien als Parameter übergeben wurden
exit unless @ARGV;
my ($dateiname, $farbraum, $format, $hoehe, $breite);
foreach (@ARGV) {
  $dateiname = $_;
  $bild = Graphics::Magick->new;
  $bild->Read ($dateiname);
  ($farbraum, $format, $hoehe, $breite) = $bild->Get('colorspace', 'format', 'height', 'width');
  print "Datei:  ", $dateiname, "\n";
  print "Format: ", $format, "\n";
  print "Größe:  ", $breite, "x", $hoehe, "\n";
  print "Modus:  ", $farbraum, "\n";
  print " \n";
}

Jede Datei, die Sie beim Aufruf als Parameter übergeben, berücksichtigt das Programm (Zeile 10). Geben Sie keine Dateien an, bricht das Programm bereits vorher ab (Zeile 7). Für einen besseren Programmierstil wäre stattdessen eine Funktion usage_exit() angebracht, die den Anwender auf fehlende Argumente hinweist. Der Aufruf in Zeile 7 müsste dann wie folgt lauten:

usage_exit() unless @ARGV

Zeile 12 erzeugt ein neues Grafikobjekt, über dessen Methoden Sie später auf die Dateien zugreifen. In der Zeile 13 öffnen Sie die Bilddatei und bestimmen danach den Bildtyp, die Bildgröße und den Farbmodus. In den Zeilen 17 bis 20 erfolgt die Ausgabe der Bildwerte, in Listing 2 beispielhaft dargestellt am Aufruf für das Polaroid-Bild aus dem ersten Teil dieser Artikelserie.

Listing 2

$ ./bildinfo.pl polaroid.png
Datei:  polaroid.png
Format: Portable Network Graphics
Größe:  296x243
Modus:  RGB

Statische Beschriftung

Im zweiten Beispiel für den Alltagsgebrauch erhalten die Aufnahmen einen Schriftzug. Auf diese Weise versehen Sie ein Bild mit dem Namen des Fotografen oder einer Beschreibung zum Motiv. Sinnvoll ist das für Bilder, die Sie über ein Online-Album oder eine Fotodatenbank im Internet bereitstellen. Hier schützt ein sichtbares Zeichen der Urheberschaft vor Missbrauch. Bei der heutzutage erzeugten Menge digitaler Aufnahmen hilft ein Kommentar dabei, zu einem späteren Zeitpunkt Ort und Datum der Aufnahme zuzuordnen.

Beim Beschriften kommt die Methode Annotate der Magick-Klasse zum Einsatz, der Sie den Text als Parameter übergeben (Listing 3). Diese Methode akzeptiert zusätzlich als Parameter verschiedene Attribute, wie zum Beispiel die Schriftart, die Schriftgröße und die Schriftfarbe. Für die Schriftart erwartet die Methode den vollständigen Pfad zur Fontdatei. Im Beispiel erfolgt die Ausgabe des Textes mittels der (fiktiven) Truetype-Datei font.ttf mit einer Schriftgröße von 40 Punkt in roter Farbe.

Listing 3

$text = 'Ostseeurlaub 2011';
$bild->Annotate (font=>'font.ttf', pointsize=>40, fill=>'red', text=>$text, x=>100, y=>100);

Der Text landet auf dem Bild an einer Position, die Sie über ein Koordinatenpaar für die waagerechte X- und senkrechte Y-Achse festlegen. Der Ursprung des Koordinatensystems befindet sich in der linken oberen Ecke des Bildes. Von da aus berechnet sich die Position in Pixeln. Um das veränderte Bild zu speichern, nutzen Sie die Write-Methode des Bild-Objektes:

$bild->Write(filename=>$dateiname);

Der Einfachheit halber speichern Sie das Skript, dessen Aufbau im Wesentlichen jenem von Listing 1 ähnelt, unter dem Namen schriftzug.pl ab (Listing 4). Sie rufen es mit folgenden Kommando auf, um ein PNG-Bild mit dem Schriftzug zu versehen:

$ ./schriftzug.pl foto.png

Abbildung 1 zeigt ein Bild nach dem Bearbeiten. Es kommt problemlos mit UTF-8-kodierten Umlauten und Sonderzeichen zurecht. Das Skript funktioniert auch, wenn Sie beim Aufruf eine ganze Serie von Bildern übergeben, die Sie identisch beschriften möchten – beispielsweise alle Aufnahmen einer Reise oder Veranstaltung.

Abbildung 1: Dank eines einfachen Perl-Skriptes versehen Sie alle Urlaubsfoto auf einen Rutsch mit einem passenden Kommentar.

Dabei hilft Ihnen die Art und Weise, wie Digitalkameras die Aufnahmen im Dateisystem der Speicherkarte der Kamera benennen. Als Dateiname für ein Bild verwenden aktuelle Modelle eine Kombination aus Buchstaben und Ziffern. Während die Abfolge der Buchstaben sich je nach Hersteller unterscheidet, geben die Ziffern in aller Regel die fortlaufende Nummer an, beispielsweise IMG0176.PNG für die 176. Aufnahme. Besteht die Bildserie aus den sechs Dateien (IMG0023.PNG bis IMG0028.PNG), sieht der Aufruf wie folgt aus:

$ ./schriftzug.pl IMG002[3-8].PNG

Die Shell wertet zunächst die Eingabezeile aus und findet dabei den regulären Ausdruck. Sie expandiert die Werte in den eckigen Klammern als einzelne Ziffern 3 bis 8 und kombiniert diese mit dem umgebenden Text zum Dateinamen. Anschließend erhält das Skript diese als Parameter.

Listing 4

#!/usr/bin/perl -w
# schriftzug.pl - Bilder statisch beschriften
# GraphicsMagick-Modul einbinden
use Graphics::Magick;
# Abbrechen, falls keine Dateien als Parameter übergeben wurden
exit unless @ARGV;
my ($dateiname, $text, $bild);
foreach (@ARGV) {
  $dateiname = $_;
  $bild = Graphics::Magick->new;
  $bild->Read ($dateiname);
  $text = 'Albi (Tarn), Midi-Pyrénées, 2008 - Frank Hofmann';
  $bild->Annotate (font=>'font.ttf', pointsize=>40, fill=>'red', text=>$text, x=>100, y=>100);
  $bild->Write(filename=>$dateiname);
}

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Ähnliche Artikel

Kommentare

Infos zur Publikation

LU 07/2015: Daten sichern

Digitale Ausgabe: Preis € 4,95
(inkl. 19% MwSt.)

Mit der Zeitschrift LinuxUser sind Sie als Power-User, Shell-Guru oder Administrator im kleinen Unternehmen monatlich auf dem aktuelle Stand in Sachen Linux und Open Source.

Sie sind sich nicht sicher, ob die Themen Ihnen liegen? Im Probeabo erhalten Sie drei Ausgaben zum reduzierten Preis. Einzelhefte, Abonnements sowie digitale Ausgaben erwerben Sie ganz einfach in unserem Online-Shop.

NEU: DIGITALE AUSGABEN FÜR TABLET & SMARTPHONE

HINWEIS ZU PAYPAL: Die Zahlung ist auch ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!       

Tipp der Woche

Grammatikprüfung in LibreOffice nachrüsten
Grammatikprüfung in LibreOffice nachrüsten
Tim Schürmann, 24.04.2015 19:36, 0 Kommentare

LibreOffice kommt zwar mit einer deutschen Rechtschreibprüfung und einem guten Thesaurus, eine Grammatikprüfung fehlt jedoch. In ältere 32-Bit-Versionen ...

Aktuelle Fragen

Fernwartung oder wartung im haus
heide marie voigt, 29.06.2015 10:37, 0 Antworten
gerne hätte ich jemanden in Bremen nord, der mir weiter hilft - angebote bitte mit preis HMVoigt
Druckeranschluss DCP-195C
heide marie voigt, 29.06.2015 10:35, 1 Antworten
installiert ist linux ubuntu 15.04 offenbar auch der treiber für den Drucker DCP-195C. Die Konta...
keine arbeitsleiste beim einloggen
heide marie voigt, 27.06.2015 13:31, 0 Antworten
seit der neu-installierung von linux ubuntu 15.04 erscheint die arbeitsleiste rechts oben erst na...
raid platte an linux mint 17.1
andreas schug, 23.06.2015 19:44, 0 Antworten
folgende thematik NAS Iomega Storage Center wird auf einmal nicht mehr im netzwerk erkannt .....
SUSE 13.2 - Probleme mit kmail
kris kelvin, 03.06.2015 13:26, 2 Antworten
Hallo, nach dem Umstieg auf 13.1 hatte ich das Problem, daß kmail extrem langsam reagierte. Nun...