StartseiteSkriptePerl

Bildbearbeitung mit Image::Magick

06. AUGUST 2011
von Jörg
Skripte - Perl

Da es sehr mühsam ist viele Bilder per "Hand" mit einem Bildbearbeitungsprogramm wie Gimp so anzupassen, dass die Bilder in einer Gallery im Internet nutzbar sind, habe ich mir ein kleines Skript geschrieben, welches mir viel Arbeit und Zeit erspart.

Das Skript verkleinert die Bilder auf die im Code angegebenen Größen und schärft diese für ein besseres aussehen. Es werden Thumbs (kleine Vorschaubilder) und die etwas größeren Bilder erstellt.

Die Verzeichnisstruktur, bei der default-Einstellung wie sie im Quellcode im Moment ist, sieht folgendermaßen aus:

|
|---[ Verzichnis ]
    |---magick.pl
    |
    |---[ erg_pics ]
    |   |--- (Dateien mit den Ergebnisbilder)
    |
    |---[ org_pics ]
        |--- (Dateien mit den Orginalbilder)

Die großen Bilder haben eine Höhe oder Breite von 600px, je nach Quer- oder Hochformat und die Vorschaubilder (Thumbs) von 160px.

Der erstellte Html-Code in der erzeugten Datei html_code.txt ist für eine Bildergallery von jQuery.js generiert. jQuery.js in die Html-Seite einbinden und das Ergebnis schaut etwa wie auf dieser Seite aus.

magick.pl:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#!d:\web\xampp\perl\bin\perl.exe -w
use Image::Magick;

my $dir        = "./org_pics/";  #Verzeichnis mit den Orginal-Bild-Dateien
my $dir_erg    = "./erg_pics/";  #Verzeichnis mit den Ergebnis-Dateien
#Verzeichnis und dateinamen der Ergebnisbilder - für Html-Code
my $title_pics = "salon";

my $pics   = 600;  #Höhe oder Breite der grossen Bilder je nach Format
my $thumbs = 160;  #Höhe oder Breite der kleinen Bilder je nach Format

#alle jpg-files in arra @files lesen
opendir(DIR, $dir);
@files =  grep { /(.jpg|.JPG)$/ } readdir(DIR);
closedir(DIR);

#jedes file bearbeiten => thumbs und vorschaubilder erzeugen 
for(my $i = 0; $i < scalar(@files); $i++){
  
  #Bild einlesen
  my($image, $x, $w, $h);
  $image = Image::Magick->new;
  $x = $image->Read( $dir.$files[$i] );
  warn "$x" if "$x";
  
  #großes pic erstellen, bearbeiten und speichern
  $big = $image->Clone();
  ($w,$h) = $big->Get("width","height");
  
  #Querformat
  if($w >= $h){
    $h = $h / $w * $pics;    
    $x = $big->Scale( width=> $pics, height=> $h);
    warn "$x" if "$x";    
  }
  #Hochformat
  else{                               
    $w = $w * $pics / $h;
    $x = $big->Scale( width=> $w, height=> $pics);
    warn "$x" if "$x";
    
  }
  
  #Schärfen
  $x = $big->Sharpen(radius=>0.06, sigma=>2);
  warn "$x" if "$x";
    
  $big->Set( density=>72 );   #x- und y-Auflösung (dpi) 
  
  #Löscht die EXIF-Informationen aus dem Bild (ca. 60kb kleiner) 
  $big->Profile(profile=>"");   
  $x = $big->Write(filename => $dir_erg.$title_pics.$i.".jpg", 
                   quality => 80, 
                   compression=>"JPEG"); 
  
  #thumb pic erstellen, bearbeiten und speichern
  $thumb = $image->Clone();
  ($w,$h) = $thumb->Get("width","height");
  
  #Querformat
  if($w >= $h){
    $h = $h / $w * $thumbs;   
    $x = $thumb->Scale( width=> $thumbs, height=> $h);
    warn "$x" if "$x";    
  }
  #Hochformat
  else{
    $w = $w * $thumbs / $h;
    $x = $thumb->Scale( width=> $w, height=> $thumbs);
    warn "$x" if "$x";    
  }
  
  #Schärfen
  $x = $thumb->Sharpen(radius=>0.06, sigma=>2);
  warn "$x" if "$x";
    
  $thumb->Set( density=>72 );   #x- und y-Auflösung (dpi) 
  
  #Löscht die EXIF-Informationen aus dem Bild (ca. 60kb kleiner)
  $thumb->Profile(profile=>"");   
  $x = $thumb->Write(filename => $dir_erg.$title_pics.$i."_t.jpg", 
                     quality => 90); 
  
  #Html-Code für Gallery erstellen
  open(FILE, ">>html_code.txt");
  if($w >= $h){
    print FILE "
<div class="pic">
  <a rel="gruppe1" href="../fotos/$title_pics/".$title_pics.$i.".jpg" class="gallery">
    <img src="../fotos/$title_pics/".$title_pics.$i."_t.jpg" 
         width="$thumbs" height="".int($h)."" alt="$title_pics Foto"/>
  </a>
</div>\n";   
  }
  else{
     print FILE "
<div class="picH">
  <a rel="gruppe1" href="../fotos/$title_pics/".$title_pics.$i.".jpg" class="gallery">
    <img src="../fotos/$title_pics/".$title_pics.$i."_t.jpg" 
         width="".int($w)."" height="$thumbs" alt="$title_pics Foto"/>
  </a>
</div>\n";
  }
  close (FILE);
  
  #Status ausgabe in der Konsole 
  print $files[$i]."\n";
}

Um dieses Script benutzen zu können wird das Perl Modul Image::Magick benötigt.
Welches mit einer Befahlszeile unter Perl Strawberry eingebunden wird:
ppm install http://www.bribes.org/perl/ppm/Image-Magick.ppd

Kommentare:

NET::Magick? Existiert das Perl-Modul wirklich bei CPAN? Ich finde keines. Nennst du es als Gag für die Suchmaschinen nur NET::Magick im Titel?

von GwenDragon am 09. AUGUST 2011 um 20:31 Uhr

Ja, es heißt ja eigentlich Image::Magick, wie ich auf NET komme ist mir ein Rätsel.

Danke.

von Jörg am 09. AUGUST 2011 um 20:44 Uhr » webdesign-haefner.de

Hinterlasse einen Kommentar

Ein Frosch der sich an der Seite festhält