Personal tools
You are here: Home GNU / Linux Corriger les informations Exif de plusieurs fichiers images
Document Actions
  • Send this page to somebody
  • Print this page
  • Add Bookmarklet

Corriger les informations Exif de plusieurs fichiers images

by Pierre-Yves Landuré last modified 2009-01-22 12:34

Je me suis récemment retrouvé devant des images dont les mots clefs Exif étaient mal saisis (ils était séparé par des "-" au lieu de "," (et oui, ça a son importance)). J'ai donc du réfléchir à un moyen d'automatiser la correction de cette mauvaise saisie. Cet article présente la solution à laquelle j'ai abouti.

Prérequis

Pour modifier les informations Exif de nos images, nous allons avoir besoin de l'outil exiftool. Pour l'installer, utilisez la commande :

sudo apt-get install libimage-exiftool-perl

Présentation de la solution

La première étape consiste à récupérer une liste des fichiers images à mettre à jour. Pour ce faire, nous nous plaçons dans le dossier contenant ces images, et nous utilisons la commande find pour obtenir une liste de tous les fichiers présents dans ce dossier :

find ./ -type f

Vous pouvez aussi limiter la liste à un type de fichier donné. Par exemple, pour obtenir la liste des images avec une extension ".tif" :

find ./ -type f -name "*.tif"

Nous disposons maintenant d'une liste des fichiers images présents dans le dossier traité. Nous devons en extraire les informations Exif que nous souhaitons mettre à jour. Dans mon cas, je suis intéréssé par la valeur du champ "Subject":

find ./ -type f -name "*.tif" | \
while read IMAGE_FILE; do
  exiftool -q -s -s -s -m -fast -ScanForXMP -Subject "$IMAGE_FILE"
done

Nous avons maintenant la liste des mots clefs par fichier. Nous allons remplacer les tirets par des saut de ligne:

find ./ -type f -name "*.tif" | \
while read IMAGE_FILE; do
  exiftool -q -s -s -s -m -fast -ScanForXMP -Subject "$IMAGE_FILE" \
| sed -e "s/-/\n/g"
done

Nous allons maintenant utiliser les mots clefs que nous avons obtenu pour reconstruire la liste des mots clefs de notre fichier image:

find ./ -type f -name "*.tif" | \
while read IMAGE_FILE; do
  KEYWORDS=$(exiftool -q -s -s -s -m -fast -ScanForXMP -Subject "$IMAGE_FILE" \
| sed -e "s/-/\n/g")
# We reset the file keywords :
exiftool -Subject= -Keywords= "$IMAGE_FILE"
# We readd the keywords properly :
echo "$KEYWORDS" | xargs -iKEYWORD exiftool -Subject+="KEYWORD" -Keywords+="KEYWORD" "$IMAGE_FILE"
done

Cette première version de la solution est fonctionnelle, mais elle réécrit le fichier autant de fois qu'il y a de mots clefs. Ce n'est pas très efficace. Nous allons donc utiliser le résultat de sed pour constuire une ligne de commande qui ajoutera tous les mots clefs en une seule fois.

La solution finale est assez complexe, car il faut prendre en considération la possibilité que les mots clefs contiennent un espace. Voici la solution à laquelle j'ai abouti. Je ne pense pas que ce soit la meilleure, mais elle est fonctionnelle :

find ./ -type f -name "*.tif" | \
while read IMAGE_FILE; do
# We build an efficient command line:
COMMAND_ARGS=$(exiftool -q -s -s -s -m -fast -ScanForXMP -Subject "$IMAGE_FILE" \
| sed -e "s/-/\n/g" | \
while read KEYWORD; do
if [ ! -z "$KEYWORD" ]; then
echo -n " -Subject=\"$KEYWORD\" -Keywords=\"$KEYWORD\""
fi
 done)

# And we apply it:
/bin/sh -c "exiftool $COMMAND_ARGS \"$IMAGE_FILE\""
done

Dans un premier temps, je construit à l'aide d'echo la ligne de commande a appliquer à exiftool, et je l'assigne à la variable $COMMAND_ARGS. J'utilise ensuite la commande /bin/sh pour éxecuter ExifTool avec ces arguments.

Solution finale

Voici la ligne de commande que j'ai utilisée pour mettre à jour mes mots clefs mal saisis (séparé par des tirets au lieu de virgules) et les remettre au propre. Par rapport à la solution précédente, j'ai simplement ajouté une option pour désactiver la sauvegarde des fichiers images originaux (je dispose d'une copie de ces fichiers dans un autre dossier). Lorsque la manipulation affecte plusieurs centaines de fichiers, ce genre de commande est un "life-saver" :):
find ./ -type f -name "*.tif" | \
while read IMAGE_FILE; do
# We build an efficient command line:
COMMAND_ARGS=$(exiftool -q -s -s -s -m -fast -ScanForXMP -Subject "$IMAGE_FILE" \
| sed -e "s/-/\n/g" | \
while read KEYWORD; do
if [ ! -z "$KEYWORD" ]; then
echo -n " -Subject=\"$KEYWORD\" -Keywords=\"$KEYWORD\""
fi
 done)

# And we apply it:
/bin/sh -c "exiftool -overwrite_original $COMMAND_ARGS \"$IMAGE_FILE\""
done

Remerciements

  • Merci à Phil Harvey qui à créé l'outil ExifTool.

Powered by Plone CMS, the Open Source Content Management System

This site conforms to the following standards:

Wikio