Open Source im professionellen Einsatz

Newsletter abonnieren
Seite durchsuchen

HEFTARCHIV | NEWS | E-BIBLIOTHEK | VIDEO | BLOGS | WHITEPAPER | EVENTS | ACADEMY | ABO | SHOP

user friendly

  Home  »  Heft & Abo  »  Heftarchiv  »  2003  »  09  »  Foto-Labor  

RSS-Feed der aktuellen News von Linux-Magazin Online Folgen Sie Linux-Magazin Online auf Twitter
Diesen Artikel druckenDiesen Artikel weiterempfehlen Diesen Artikel kommentieren Newsletter abonnieren
Share/Bookmark

Ebenen stapeln

Die darauf folgende Methode »layer_set_mode()« setzt den Modus der neuen Ebene auf »OVERLAY_MODE«, die Konstante hat das Skript wegen des »:auto«-Tags in Zeile 9 bequemerweise automatisch importiert. Diese Aktion entspricht der Wahl des Overlay-Modus im Layer-Dialog von Gimp. »image_add_layer()« in Zeile 60 fügt den neu erzeugten Layer zum Bild hinzu, der auf »-1« gesetzte Parameter stapelt ihn über die bestehende Basisebene.

Damit der Gimp-Benutzer bei lange dauernden Aktionen nicht die Nerven verliert, initialisiert »dreamify« mit »Gimp ->progress_init(" Titel")« eine Fortschrittsanzeige und aktualisiert sie nach den einzelnen Schritten mit »Gimp ->progress_update( Bruchteil)«. Bruchteil ist ein Fließkommawert zwischen 0 und 1 und gibt die Position des Fortschrittsbalkens an.

Zeile 63 skaliert das Bild auf 800 mal 600 Pixel, hierzu ruft sie die ab Zeile 89 definierte Funktion »scale_image_down« auf. Diese erwartet ein Image-Handle sowie die gewünschte Maximalgröße des Bildes und verändert das Bild direkt.


Abbildung 3: Der neue Perl-gesteuerte Menüpunkt »Dreamify« erscheint in Gimps Kontextmenü: Nach dem Maus-Rechtsklick muss der Anwender in das »Perl-Fu«-Untermenü wechseln.

Passend skalieren

Die Funktion berechnet zunächst, ob das Bild im Querformat statt - wie erwartet - im Hochformat vorliegt. In diesem Fall korrigiert sie die Maximalgröße auf 600 mal 800 Pixel. Überschreiten Breite und Höhe des Bildes ihren Maximalwert, wird das Bild mittels »image _scale« so verkleinert, dass die Bildproportionen erhalten bleiben.

Das Glätten des Bildes findet in Zeile 67 per »plug_in_gauss_iir« mit dem Gaussian-Blur-Algorithmus statt, der Unschärferadius beträgt 20. Die Funktion aktiviert sowohl horizontale also auch vertikale Unschärfe, dazu setzt das Skript die beiden letzten Parameter auf True. Zeile 72 schließlich hellt die Farben im Bild mit einem Gammafaktor von »1.5« etwas auf, Ein- und Ausgabebereiche bleiben mit 0 bis 255 konstant. Das entspricht einem etwas nach links verschobenen Intensity-Regler in Gimps »Image | Colors | Level«-Dialog. Anschließend fügt Zeile 75 die beiden Layer zu einem einzigen zusammen, Zeile 76 holt dessen Handle.

Listing 1:
Dreamify-Skript

001 #!/usr/bin/perl
002 ###########################################
003 # dreamify - Gimp Image Dreamifier
004 # Mike Schilli, 2003 (m@perlmeister.com)
005 ###########################################
006 use warnings;
007 use strict;
008 
009 use Gimp qw(:auto);
010 use Gimp::Fu;
011 use Pod::Usage;
012 
013 use Log::Log4perl qw(:easy);
014 Log::Log4perl->easy_init($DEBUG);
015 
016 my $menu = "<Toolbox>/Xtns/Mike/Dreamify";
017 my $jpg_file;
018 
019 if(grep /-gimp/, @ARGV) {
020     # Call from within Gimp
021   $menu = "<Image>/Perl-Fu/Dreamify";
022 } else {
023     # Call from the command line
024   $jpg_file = $ARGV[0];
025   pod2usage("No file")
026       unless defined $jpg_file;
027 }
028 
029 register(
030   "perl_fu_dreamify",    # Name
031   "Dreamify a Picture",  # Blurb
032   "=pod(HELP)",          # Help
033   "=pod(AUTHOR)",        # Author
034   "=pod(COPYRIGHT)",     # Copy
035   "=pod(DATE)",          # Date
036   $menu,                 # Menu
037   "",                    # Images accepted
038   [],                    # Parameters
039   [],                    # Return values
040   &dreamify             # Function
041 );
042 
043 ###########################################
044 sub dreamify {
045 ###########################################
046   my($img, $layer) = @_;
047 
048   Gimp->progress_init("Dreamifying ...");
049 
050   if(!$img) {
051     DEBUG "Loading $jpg_file";
052     $img = file_jpeg_load($jpg_file, "");
053     die "Can't load $jpg_file" unless $img;
054     $layer = image_get_active_layer($img);
055   }
056 
057   DEBUG "Copying layer";
058   my $new_layer = $layer->layer_copy(0);
059   $new_layer->layer_set_mode(OVERLAY_MODE);
060   $img->image_add_layer($new_layer, -1);
061   Gimp->progress_update(.1);
062 
063   scale_image_down($img, 800, 600);
064   Gimp->progress_update(.5);
065 
066   DEBUG "Blurring";
067   $img->plug_in_gauss_iir($new_layer,
068                           20.0, 1, 1);
069   Gimp->progress_update(.8);
070 
071   DEBUG "Adjusting Colors";
072   $new_layer->gimp_levels(0, 0, 255, 1.5,
073                           0, 255);
074 
075   $img->flatten();
076   $layer = $img->get_active_layer;
077   Gimp->progress_update(1);
078 
079   if($jpg_file) {
080       (my $png_file = $jpg_file) =~
081                            s/.jpg$/.png/g;
082       DEBUG "Saving to $png_file";
083       $layer->file_png_save($png_file, "",
084                             0, 6, (1) x 5);
085   }
086 }
087 
088 ###########################################
089 sub scale_image_down {
090 ###########################################
091   my($img, $x, $y) = @_;
092 
093   my $w = $img->image_width();
094   my $h = $img->image_height();
095 
096     # Switch x,y if portrait
097   ($x, $y) = ($y, $x) if $w < $h;
098 
099   DEBUG "Limits $x x $y";
100   DEBUG "Size   $w x $h";
101 
102   if($w > $x and $h > $y) {
103       my $new_h = int($h*$x/$w);
104       DEBUG "Resizing to $x x $new_h";
105       $img->image_scale($x, $new_h);
106   }
107 }
108 
109 exit main;
110 
111 __END__
112 
113 =head1 NAME
114 
115 Dreamify - Gimp Plugin for dreamy pictures
116 
117 =head1 SYNOPSIS
118 
119     dreamify file.jpg
120 
121 =head1 HELP
122 
123 Adds a second layer to a picture in
124 "Overlay" mode, lightens up the colors,
125 applies a Gaussian blur and rescales the
126 result to 800x600. Operates on the current
127 picture if called from within Gimp via
128 C<Rightclick/Perl-Fu/Dreamify>. If called
129 from the command line, it modifies the JPG
130 file specified, flattens the result and
131 writes it back as PNG.
132 
133 =head1 AUTHOR
134 
135 Copyright 2003 by Mike Schilli, all rights
136 reserved. This program is free software,
137 you can redistribute it and/or modify it
138 under the same terms as Perl itself.
Diesen Artikel druckenDiesen Artikel weiterempfehlen Diesen Artikel kommentieren Newsletter abonnieren
Share/Bookmark
Ähnliche Artikel
Alter geht vor Schönheit Perl automatisiert Bildverarbeitung mit Gimp
Hinterm Horizont GPS-Daten mit Perl auswerten und online in Karten einblenden
Listenreich Mailinglisten-Software Sympa 6
Gepackte Koffer Skripte zur Arbeitserleichterung und ein Archiv-Modul
Ich sehe dich Einbrüche im High Interaction Honeynet beobachten
PDF nach Maß PDF-Dateien unter Linux konvertieren und bearbeiten
Whitepaper
Daten Migration - Eine Publikation von Bloor Research

Datenmigrationsprojekte überschreiten häufig das Budget, neigen zu Verzögerung und werden unter Umständen komplett abgebrochen. Bloor Research ist eines der weltweit führenden IT-Forschungs-, Analyse- und Beratungsunternehmen und wird in dem vorliegenden White Paper die wichtigsten Aspekte dieser Problematik näher beleuchten. Ferner werden praktische Empfehlungen für erfolgreiche Migrationsprojekte gegeben, die Sie auf Ihr nächstes Projekt übertragen können.

Download PDF (Registrierung erforderlich)
Open Source Datenintegration in der Praxis: Fallstudien und Anwendungsbeispiele

Über die letzten Jahre hinweg haben sich Open Source Lösungen als fester Bestandteil des gesamten Datenintegrationsmarktes etabliert. Viele Unternehmen haben bereits das Open Source Modell für Ihre Datenintegrationsprojekte aufgegriffen. Das vorliegende White Paper illustriert anhand ausgewählter Fallstudien und Anwendungsbeispiele die Implementierung von Open Source Datenintegration in der Praxis und benennt die daraus resultierenden Vorteile.

Download PDF (Registrierung erforderlich)
Kommentare (0)