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.

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

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);
}
Tip a friend    Druckansicht Bookmark and Share
Kommentare

8766 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

Owncloud mit Linuxmint 15 32 Bit
Santana Muggel, 24.04.2014 16:45, 0 Antworten
Hallo, ich habe nach dem Artikel in Heft 05.2014 versucht, owncloud einzurichten. Bei der Inst...
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...