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.

Schéma XMP / IPTC parseur

Bonsoir,

Dans le développement du CN2SV, j’ai programmé un parser XMP, IPTC à partir de la librairie « PHP JPEG Metadata Toolkit » de E. Hunter. Le schéma XMP est prometteur même s’il est lié à Adobe. Mais la programmation d’un programme en php lisant les méta-données IPTC est facile et la technologie est mure aujourd’hui. L’IPTC a adopté XMP comme schéma de la toute dernière version de son standard de description des photographies : IPTC Core (http://www.iptc.org/IPTC4XMP/). Avec l’utilisation massive des appareils photos numériques, qui truffent leurs images de méta-données, il est temps d’offrir aux utilisateurs d’intergiciel (middlewares) en php, jsp, java, asp, la possibilité de lire ces données et de les enrichir.

Un simple parseur IPTC en PHP (PHP 3 >= 3.0.6, PHP 4, PHP 5) :

 function output_iptc_data( $image_path ) { 
   $size = getimagesize ( $image_path, $info);      
    if(is_array($info)) {        
     $iptc = iptcparse($info["APP13"]);        
     foreach (array_keys($iptc) as $s) {            
     $c = count ($iptc[$s]);            
      for ($i=0; $i <$c; $i++) {            
       echo $s.' = '.$iptc[$s][$i].' - ';           
      }        
     }    
    } 
  }

(source : site www.php.net)

Nous allons intégrer un lecteur/editeur IPTC/XMP à Iceberg. Je tiens d’ailleurs à remercier Romain et Frédéric, les deux développeurs contractuels du CN2SV qui font un travail formidable.

A bientôt,
Stéphane.

« IPTC Core » est la propriété intellectuelle de IPTC. XMP, Photoshop and Creative Suite (CS) sont des marques commerciales de la société Adobe Systems Inc.