sp.Blog

le blog de Stéphane Pouyllau

Étiquette : perl

Images, métadonnées et encapsulage XMP ou IPTC

Bonjour,

J’utilise, depuis quelques temps, Exiftool pour encapsuler de l’information, sous la forme de métadonnées IPTC/IIM ou XMP, dans des images fixes. Pour pouvoir traiter un très grand nombre d’images, j’ai améliorer un petit programme en PERL qui permet, depuis un fichier de type texte structuré (un tableau de données donc), d’écrire des informations sous la forme de métadonnées embarquées dans l’image. Dans la mise en place de corpus en SHS, l’utilisation des programmes en PERL n’est plus « à la mode » à l’heure du tout web : c’est dommage car ce langage est très pratique pour traiter de gros volume de données.

Le programme en question est simple : pour chacune des images, il encapsule les informations structurées correspondantes. ces informations sont présentes sous forme de lignes dans le tableau. Les champs, qui structure les informations, sont déterminés par les colonnes du fichier. C’est pour cela que j’utilise le format CSV (Comma-separated values) pour mon petit tableau. Les informations sont donc disposées de la façon suivante :

Cals

La 1ère ligne contient principalement le nom des champs IPTC (title, date, etc.) ou XMP. Je renvois le lecteur au site de Ph. Harvey qui liste l’ensemble des type de champs qu’il possible de gérer avec Exiftool.

A partir de ce tableau et avec le programme PERL, il est donc possible d’écrire les informations, selon leurs champs, dans chacune des images listée dans la première colonne.

Pour faire fonctionner ce petit programme PERL, que j’ai nommé cn2sv-CSVtoXMP.pl, il faut un environnement PERL installé sur son ordinateur. Sous Linux ou Unix, PERL est en standard. Sous Windows, je conseille d’installer le logiciel Active Perl. Il suffit de l’installer à la racine de C:\. (dans C:\Perl par exemple). Il est important d’installer Active Perl avec toutes ses options.

Il faut ensuite créer, par exemple, un répertoire « C:\Perl\eg\CSVtoXMP » et y mettre le contenu de cette archive zip que j’ai préparé pour plus de facilité et qui contient :

  • un répertoire « lib » contenant les librairies perl
  • un répertoire « img » contenant les images à traiter
  • le script exiftool-CSVtoXMP.pl qui va faire le travail
  • le programme exiftool.pl (version PERL d’exiftool) de Ph. Harvey
  • le fichier data.csv contenant les méta-données à en-capsuler dans les images

Redémarrez ensuite votre ordinateur.

Une fois le fichier data.csv conforme avec vos besoins. Il suffit de lancer l’outil en utilisant une ligne de commande sous DOS (ou Linux). Sous windows, « démarrez »> »Executer »> »cmd » ; puis « cd Perl\eg\CSVtoXMP ». Ensuite vient le temps du lancement du programme à proprement parlé : exiftool-CSVtoXMP.pl data.csv img ou « exiftool-CSVtoXMP.pl » = le nom de l’outil ; « data.csv » = le nom du fichier csv ; « img » = le nom du répertoire contenant les images.

Bon encapsulage de métadonnées ! Pour les plus mordus, je met ci-dessous le code PERL de Ph Harvey que j’ai utilisé et simplifié.

#!/usr/bin/perl -w
use strict;
BEGIN {
# add script directory to include path
my $exeDir = ($0 =~ /(.*)[\\\/]/) ? $1 : '.';
unshift @INC, "$exeDir/lib";
}
use Image::ExifTool;

my $txt = shift or die
"Lancement du script : exiftool-CSVtoXMP.pl 
NOMDUFICHIERCSV [NOMDUREPERTOIREDESIMAGES]\n";

open FILE, $txt or die "Erreur d'ouverture de $txt\n";
my $dir = shift || '';
$dir .= '/' if $dir;

my $exifTool = new Image::ExifTool;
my @tags;
while (<FILE>) {
chomp;
# split up values found in this line (assume tab delimiter)
my @values = split /\t/, $_;
next unless @values;
unless (@tags) {
$values[0] eq 'filename' or die "'filename' introuvable\n";
shift @values;
@values or die "Pas d'attribut\n";
@tags = @values;
print "Enregistrement des attributs : @tags\n";
next;
}
my $file = $dir . shift(@values);
unless (-e $file) {
warn "$file non présent\n";
next;
}
@values >= @tags or die "Pas de valeur pour l'attribut : $file\n";
my $tag;
$exifTool->SetNewValue();   # clear old values
# set new values for all tags
foreach $tag (@tags) {
my $val = shift @values;
$exifTool->SetNewValue($tag, $val);
}
# update the file
my $result = $exifTool->WriteInfo($file);
if ($result == 1) {
print "$file mise à jour\n";
} elsif ($result == 2) {
print "$file non mise à jour\n";
} else {
print "$file - erreur d'écriture!\n";
last;
}
}
# end

Bon dimanche.

Stéphane.

Ca, mais si souviens toi, c’était où déjà ? ou le geocaching scientifique

Pour noël, j’ai eu un GPS ! Ceux qui me connaissent me diront que n’ayant pas de voiture à Paris, ce n’est pas très utile. Et pourtant, si l’ont veut géo-référencer les photos de noël et le déballage des cadeaux par les enfants, cet outil devient très pratique, testons un peu…

D90+GP-1

J’ai donc un GPS pour mon D90 : il s’agit de l’unité GP-1, qui se place à la place du flash ou sur le coté. Pour info, dans le Nikon P.6000, un compact, le GPS est en standard.

Mes grands-parents, s’ils étaient en vie, diraient : « Mais que fait Stéphane, dans le jardin, avec un appareil photographique pointant vers le ciel ? » Au début, la première capture des satellites est un peu longue : plus de 5 s., c’est déjà embêtant si vous devez déclencher tout de suite… passons. En laissant l’appareil en veille, ça va mieux. Ensuite cela semble assez précis (même dans le jardin), l’altitude aussi (testé avec un bon vieil altimètre).

D90+GP-1

Clic-clac, les coordonnées et l’altitude sont bien capturées et incluses dans les méta-données EXIF de l’image. Avec Exiftool (et tous les outils qui tourne autour), par exemple, il est facile de voir et d’exporter ces valeurs de positionnement (extrait) dans ExiftoolGUI…

D90+GPS_1

De les sortir sous la forme d’un tableau HTML (voir plus bas)…

EXIF GPSVersionID 2.2.0.0
EXIF GPSLatitudeRef North
EXIF GPSLongitudeRef West
EXIF GPSAltitudeRef Above Sea Level
EXIF GPSTimeStamp 11:24:24
EXIF GPSSatellites 05
EXIF GPSMapDatum
EXIF GPSDateStamp 2008:12:25
Composite GPSAltitude 36 m Above Sea Level
Composite GPSDateTime 2008:12:25 11:24:24
Composite GPSLatitude 44 deg 45′ 15.21″ N
Composite GPSLongitude 0 deg 34′ 31.58″ W
Composite GPSPosition 44 deg 45′ 15.21″ N, 0 deg 34′ 31.58″ W
Composite SubSecDateTimeOriginal 2008:12:25 13:21:45.00

…Et bien entendu, il est très facile d’exploiter cela avec un outil cartographique en local, tel que l’excellent GeoSetter dont une version en français est disponible :

D90+GPS_2

D90+GPS_3
ou bien via l’outil carte de Flickr (là, rien à faire de particulier, les photos sont positionnées par défaut lors du chargement).

Tout cela peut aussi ce faire via son Firefox avec IExif, Dans la monde Google avec Picasa et Google Earth, etc.

Si le format EXIF vous pose un problème, il est possible de stocker ces données dans du MIX. C’est évidement plus complexe pour l’exploitation, du moins pour le grand public.

Extraire ce type de méta-données avec du Perl est très facile : le programme perl exiftool de Phil Harvey est très bien pour cela : une petit ligne du type « Exiftool -exif:GPSAltitude -h  img > mes_exifs.html » et l’on récupère l’altitude d’une série d’images dans un tableau HTML.

Avec du PHP c’est possible aussi : il faut charger les extensions php_mbstring et exif (dans cet ordre) dans le php.ini ; ensuite il est possible d’utiliser la fonction exif_read_data.

Bref, bientôt TOUS les appareils géo-tagueront en automatique et l’on ne comprendra pas pourquoi les photos anciennes ne le sont pas (les documentalistes vont avoir du travail) : ainsi les interfaces d’intérogations vont évoluer : un fond de carte, des outils de sélection (ronds, carrés, etc.), des plots de couleurs, des requêtes externes, des réponses aux questions qui s’afficheront sous la forme d’un chapelet de marqueurs. Au CN2SV, nous avons commencé à le faire des cartes et des atlas anciens, j’imagine ce que nous allons faire dans quelques années !

Capture d'écran de l'application CN2SV pour les géodonnées

Mais j’y pense… le temps d’écrire ce billet et tout cela doit déjà exister, j’en suis sûr (et en open-source ?). En attendant la suite, j’espère que les artistes vont trouver des applications moins « utiles » que celles décrites ici. Je m’en retourne à mon mash-up de noël.

Joyeuses fêtes,

Stéphane.

Fièrement propulsé par WordPress & Thème par Anders Norén