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

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Mandriva gibt Distribution in die Hände der Community
(268 Punkte bei 24 Stimmen)
Neues vom Systemd
(179 Punkte bei 5 Stimmen)
Mandriva in Nöten
(161 Punkte bei 4 Stimmen)
Mageia 2 ist fertig
(161 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Shopping
Topsuche
 
Yatego Deutschlands größte Shoppingmall. 10000 Shops,
3.5 Mio Artikel. Alle Bestseller, Servertechnik und Technik Themenwelten.

Notebooks und Netzwerkhardware bei Mercateo günstig kaufen.
Internet Telefonie mit VoIP Telefonen von Gigaset
Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.
Günstige Digitalkameras finden Sie im Preisvergleich.

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

1670 Hits
Wertung: 110 Punkte (2 Stimmen)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

LinuxUser 06/2012

Aktuelle Ausgabe kaufen:

Heft bestellen Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,50 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 56,10) können Sie im LNM-Shop bestellen.

Tipp der Woche

Adobe AIR
Adobe-AIR-Programme installieren und (manuell) starten
Tim Schürmann, 14.05.2012 13:09, 0 Kommentare

Es gibt sie noch: neue Anwendungen, die Adobes Integrated Runtime voraussetzen. Aktuellstes und vermutlich auch größtes Beispiel ist das Adventure Botanicula

Aktuelle Fragen

gibt es ein Kommandozeilen Tool, um ein X11-Fenster in ein Anderes einzubetten?
GoaSkin , 21.05.2012 16:44, 0 Antworten
Das XEmbed-Protokoll ist u.A. dazu gedacht, dass man eine X11-Anwendung in eine andere wie ein Wi...
Apache2, Options -Indexes geht nicht
no no, 12.05.2012 19:01, 8 Antworten
Habe in apache2.conf folgendes stehen: Options -Indexes ...
LInux auf Dell LS H500
Andreas Endresl, 09.05.2012 08:54, 2 Antworten
Habe einen alten Dell Latitude LS H500 nur mit ext. Floppy und CD es geht nur immer eines von den...
Datenwiederherstellung unter Ubuntu 12.04 mit "Simple Backup" nach Umzug von Linux Mint
Christian Lottmann, 07.05.2012 13:33, 0 Antworten
Vor dem Umzug auf Ubuntu 12.04 habe ich unter Linux MInt mit "Simple Backup" voll (15.4.2012) und...
DKMS für den propritären NVIDIA-Treiber
Commander Data, 26.04.2012 22:02, 2 Antworten
Hallo an die Gemeinde. Ich habe hier ein interessantes Stück openSuSE gefunden. http://forums.op...