Ziirish's Home :: Blog

Ziirish's Pub

 
 

Ouais, la semaine dernière, j'étais en vacances. Même que c'était 'achement bien !

Et qui dit vacances dit photos. BEAUCOUP de photos (pas toutes de moi, parce que 1/ j'ai pas d'appareil photo autre que mon téléphone tout pourri 2/ je suis mauvais photographe 3/ j'ai la flemme ) Mais je suis parti avec des amis, et en mettant en commun toutes nos photos, on arrive à près de 400 !

Comme j'ai une bande passante montante de merde, et qu'on a mis nos photos sur mon serveur, la première chose à faire a été de réduire la taille de ces dites photos.

Mais passer par The Gimp pour 400 images, c'est juste inconcevable pour un fainéant de ma trempe :)

Du coup, j'ai redécouvert mon outil de manipulation d'images favori : imagemagick .

Et voici comment on réduit nos images :


$ for file in *.JPG
do
convert $file -resize 800x600\> small_$file
done

Le '\>' et là pour dire "tu redimensionne si et seulement si l'image est plus grande que 800x600".

Là, on a économisé de la BP en 5 minutes, et sans se prendre la tête :)

Autre problème, redresser les photos prise verticalement. Même en considérant que "seulement" 10% des photos soient prises verticalement, ça nous fait 40 photos à pivoter, et comme plus haut, j'ai juste la flemme de le faire à la mano. D'autant plus que les images sont sur mon serveur, sans interface graphique kikoolol.

La solution (partielle) ? Les données EXIF incluses dans les photos ! Par chance, mes amis disposent d'un téléphone certes pas très propre, mais qui est capable d'inclure l'angle de la prise de vue dans les données EXIF.

Il ne nous reste plus qu'à retourner les photos !


$ for file in small_*
do
orient=$(exif --tag=Orientation $file | grep Value | uniq | cut -d: -f2)
if [[ "$orient" == " right - top" ]]
then
echo "rotate $file..."; convert $file -rotate 90 r_$file
fi
done

Sur les iPhone 3Gs, on pourrait même géolocaliser la photo, mais pour ça il faut activer la puce GPS.

Enfin, quand on mets en commun plusieurs prises de vues, il faut les classer par chronologie. Les EXIF vont encore nous sauver sur ce coup :D


$ for file in *.JPG
do
ex=$(exif --tag="Date and Time" $file | grep Value | sed "s/^[[:blank:]]*Value:[[:blank:]]*//" | tr ' ' _)
echo "$ex $file"
done >list
$ sort list >sorted
$ head sorted
2010:08:03_09:53:07 small_IMG_1091.JPG
2010:08:03_12:05:54 small_IMG_1092.JPG
2010:08:03_12:05:59 small_IMG_1093.JPG
2010:08:03_14:04:40 small_DSC00043.JPG
2010:08:03_14:05:01 small_DSC00044.JPG
2010:08:03_14:05:21 small_DSC00045.JPG
2010:08:03_14:07:50 small_IMG_1094.JPG
2010:08:03_14:09:11 small_IMG_1095.JPG
2010:08:03_14:21:12 small_IMG_1096.JPG
2010:08:03_15:27:37 small_DSC00046.JPG
2010:08:03_15:27:44 small_DSC00047.JPG
2010:08:03_15:27:53 small_DSC00048.JPG
2010:08:03_15:27:57 small_IMG_1097.JPG

Reste plus qu'à faire une joulie (ou pas) mise en page, comme toujours automatique, parce que flemme :D Rien de mieux que Perl pour cela !


#!/usr/bin/perl

use strict;
use warnings;
use CGI; # load CGI routines

open(LIST,"/where/is/sorted");

my $q = CGI->new; # create new CGI object
print $q->header(-charset=>'utf-8'),
$q->start_html(-title=>'Our Scottish trip',
               -style=>{'src'=>'css/lightbox.css'},
               -script=>[
                        {
                            -type => 'text/javascript',
                            -src  => 'js/prototype.js'
                        },
                        {
                            -type => 'text/javascript',
                            -src  => 'js/scriptaculous.js?load=effects,builder'
                        },
                        {
                            -type => 'text/javascript',
                            -src  => 'js/lightbox.js'
                        }
                        ]
              );

while (<LIST>) {
    chomp;
    my ($date,$file) = split(/ /,$_);
    $date =~ s/_/ /;
    next unless $file =~ /\.JPG/;
    my $full = $file;
    $full =~ s/small_//;
    if ($file =~ /^small_IMG_03\d+\.JPG$/) {
        print "\t".$q->a({-href=>"pics/$file",-target=>'_new',-rel=>'lightbox[scotland]',-title=>"© blih - $date"},$q->img({src=>"pics/$file"}))."\n";
    } elsif ($file =~ /^small_IMG_\d+\.JPG$/) {
        print "\t".$q->a({-href=>"pics/$file",-target=>'_new',-rel=>'lightbox[scotland]',-title=>"© blah - $date"},$q->img({src=>"pics/$file"}))."\n";
    } else {
        print "\t".$q->a({-href=>"pics/$file",-target=>'_new',-rel=>'lightbox[scotland]',-title=>"© moi - $date"},$q->img({src=>"pics/$file"}))."\n";
    }
}

print $q->end_html; # end the HTML

close(LIST);

Et voilà comment on a nos photos classées, "droites", etc. en 10 minutes :)