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

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Debian 7.1 ist erschienen
(179 Punkte bei 5 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

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);
}
Einem Freund empfehlen    Druckansicht Bookmark and Share
Kommentare

3177 Hits
Wertung: 144 Punkte (10 Stimmen)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

LinuxUser 07/13

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

whowatch
Nutzer und Prozesse mit whowatch überwachen
Tim Schürmann, 18.06.2013 12:49, 0 Kommentare

Wenn Administratoren herausfinden wollen oder müssen, was die Benutzer auf einem System gerade so treiben, dann hilft ihnen whowatch. Das kleine Kommandozeilenprogramm zeigt in Ec...

Aktuelle Fragen

SUSE 12.3 64Bit: Miro funzt nicht
Wimpy *, 14.06.2013 13:05, 5 Antworten
Seit Installation von openSUSE 12.3 64Bit startet Miro nicht. (Version 5.0.4-1.24-x86_64 von Pa...
Kontakt via QR code hinzufügen
Herman Sproesser, 17.05.2013 17:46, 4 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...