User:Ancalagon/Gallica.pl

From Wikimedia Commons, the free media repository
Jump to: navigation, search

Usage : perl Gallica.pl btv1 [... btvn]

Pour récupérer l'image http://gallica.bnf.fr/ark:/12148/btv1b7703707t

perl Gallica.pl btv1b7703707

Les composants de l'image sont récupérés et réassemblés grâce à l'utilitaire jpegtran.

use strict;
use warnings;

use LWP::Simple;
use Image::Size;
foreach my $arg (@ARGV){
   my ($H, $L, $maxH, $maxL) = (0, 0, 0, 0);
   my $step = 2048;
   my $document = $arg;
   my $jpeg;
   mkdir $document;         # Création du répertoire
   # Récupération des images
   foreach my $i (0 .. 6){
       foreach my $j (0 .. 6){
           $H = $i * $step;
           $L = $j * $step;
           
           my $url =  "http://gallica.bnf.fr/proxy?method=R&ark=" . $document . ".f1&r=$H,$L,$step,$step";
           my $jpeg = "$document\\${L}_${H}.jpg";
           
           if(! -f $jpeg ){
               print "Getting ", $url, " for ", $jpeg, "\n";
               next if ! is_success(getstore($url, $jpeg))
           }
           
           $maxH = $H if ($H > $maxH);
           $maxL = $L if ($L > $maxL);
       }
   }
   my $cmd;
   # Reconstitution de l'image globale
   for ($H = 0; $H <= $maxH; $H += $step){
       for ($L = 0; $L <= $maxL; $L += $step){
           my $jpeg = "$document\\${L}_${H}.jpg";
           
           if($H == 0 && $L == 0){
               my $sizeL = $maxL + $step;
               my $sizeH = $maxH + $step;
               
               $cmd = "jpegtran -crop ${sizeL}x${sizeH}+0+0 $jpeg _$document.jpg";
               print $cmd, "\n";
               system $cmd;
               next;
           }
           
           $cmd = "jpegtran -drop +$L+$H $jpeg _$document.jpg _$document.jpg";
           print $cmd, "\n";
           system $cmd;
       }
   }
   # On ajuste la taille de l'image à partir de celle du bord inférieur droit
   my ($global_L, $global_H) = imgsize("_$document.jpg");
   my ($_L, $_H) = imgsize("$document\\${maxL}_${maxH}.jpg");
   my ($sizeL, $sizeH) = ($global_L - ($step - $_L), $global_H - ($step - $_H));
   $cmd = "jpegtran -crop ${sizeL}x${sizeH}+0+0 _$document.jpg $document.jpg";
   print $cmd, "\n";
   system $cmd;
   system "del _$document.jpg"
}