sp.Blog

le blog de Stéphane Pouyllau

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.

Précédent

Lundi…

Suivant

Interopérabilité : faire des choix, échanger, gérer le temps

4 Commentaires

  1. Bonne idée Stéphane !
    Le sujet a déjà été évoqué plusieurs fois sur la liste ControlledVocabulary. La dernière en date, topic « Import metadata » :
    http://tech.groups.yahoo.com/group/controlledvocabulary/message/6531
    (il faut un login Yahoo!)
    Cependant, aucune des solutions évoquées n’utilise Perl si je me souviens bien, et il serait intéressant de décrire en anglais ta solution pour les lecteurs de ControlledVocabulary.

  2. Merci Stephane,

    J’inclue des métadonnées dans mes jpeg pour l’instant via PixVue (téléchargé sur le site de Patrick Peccatte d’ailleurs). Je cherchais à automatiser ça, sans oser me lancer.
    J’avais repérer exiftool cependant. Ta solution va sans doute me servir.

  3. Merci pour vos commentaires, ce programme se veut simple vous l’avez compris. Si vous l’améliorez, merci de le dire, je mettrai à jour le billet. Pour la version en anglais, Patrick, si tu t’en sent de le faire… you’re wellcome ;-)

  4. Bonsoir Stéphane,

    Merci pour le cours. En tant qu’ancien élève, je suis toujours preneur de ces quelques minutes supplémentaires.

    De mon côté, et pour les produits photothèques (plateforme LAMP), j’utilise une base de données MySQL comme source de données.

    Une ligne de commande transmet les instructions au programme Exiftool, en argument d’une fonction php exec();

    Je commence par écrire les champs XMP. La traduction vers les champs IPTC équivalents est assuré par le script contenu dans le fichier xmp2iptc.args qui doit être présent dans les sources de Exiftool.

Les commentaires sont fermés

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