Table des matières

Jhead : Outil de manipulation des en-têtes Exif des fichiers Jpeg

Jhead est un programme en ligne de commande pour manipuler les méta-données des fichiers JPEG/Exif que produisent la plupart des appareils photo numériques.

Utilisateurs Windows / Mac : Jhead n'a pas d'interface utilisateur graphique. Cliquer dessus avec la souris sous Windows ou Mac OS-X ne fera rien, il faut l'utiliser dans l'invite de commande.

Fonctionnalités du programme Jhead v3.04 :

  1. jhead peut extraire d'un fichier jpeg les données Exif suivantes :
    1. Heure et date de prise de vue
    2. Marque et modèle de l'appareil photo
    3. Miniature Exif basse résolution intégrale
    4. vitesse d'obturation
    5. Numéro F-stop de l'appareil
    6. Utilisation du flash (oui/non)
    7. Distance de mise au point
    8. Distance focale et calcul de la distance focale équivalente 35 mm
    9. Résolution de l'image
    10. Informations GPS, si elles sont enregistrées dans l'image
    11. En-tête IPTC
    12. Données XMP
  2. jhead peut modifier dans un fichier jpeg les données Exif suivantes :
    1. Cadrage en haut à droite selon le tag rotation en utilisant jpegtran
    2. Définir ou ajuster les horodatages exif internes
    3. Correction des décalages de date/heure dans de grands lots d'images
    4. Renommer ou horodater les fichiers selon l'horodatage exif
    5. Transférer les en-têtes exif entre les images
    6. Remplacer les vignettes dans les en-têtes Exif
    7. Modifier les commentaires jpeg (mais pas les commentaires Exif)
    8. Supprimer les sections exif ou commentaires des images jpeg
    9. Créer un nouvel en-tête exif minimal contenant la date et la vignette

Les fichiers provenant de presque tous les appareils photo numériques sont des fichiers Jpeg avec des données Exif.

Les fichiers Exif sont pour la plupart des fichiers Jpeg, mais contiennent des sections de données supplémentaires avec les paramètres de l'appareil photo, ainsi qu'une vignette d'aperçu dans l'en-tête Exif.

De nombreux navigateurs d'images utilisent cette vignette lors de la navigation, tandis que d'autres navigateurs créent leurs propres vignettes en fonction de l'image dans son ensemble.

Comme je m'intéresse à la photographie, je suis toujours curieux de savoir quels paramètres mon appareil photo numérique entièrement automatique a finalement utilisé.

En 1999, lorsque j'ai créé jhead, je ne trouvais pas de programme qui affiche les paramètres, ni qui pourrait être compilé dans un simple exécutable.

Depuis, j'ai ajouté de nombreuses autres fonctionnalités à jhead, dont beaucoup sont le résultat de suggestions ou de contributions de code.

Bien qu'il existe aujourd'hui de nombreux programmes capables de manipuler les en-têtes Exif, jhead reste l'outil le plus simple et le plus efficace, surtout pour des tâches automatisées ou scriptées.

Pré-requis

Installation

  1. Installez jhead

    USER@MACHINE:~$ sudo apt install {jhead,}

Configuration

Options générales sur les métadonnées

-te <name>
Transférer l'en-tête Exif de l'image <nom> dans l'image spécifiée.Transférer l'en-tête Exif de l'image <nom> dans l'image spécifiée.
Cette option est utile pour modifier les photos tout en conservant l'en-tête Exif.
La plupart des programmes de retouche photo effaçant l'en-tête Exif, cette option permet de la rétablir après retouche des photos.
Cette fonction propose une intéressante option de “chemin relatif” pour spécifier le nom de la vignette.
Si <name> contient les caractères '&i', jhead remplacera le nom de fichier original par ce nom.
Cela permet de créer un “nom relatif” pour un lot de fichiers.
Par exemple, la phrase suivante :

USER@MACHINE:~$ jhead -te "originals\&i" *.jpg

transférera l'en-tête Exif de chaque fichier .jpg du même nom dans le répertoire d'origine.

Win32 et la plupart des shells UNIX traitent le caractère “&” d'une manière spéciale, de sorte que vous devez mettre des guillemets autour de cette option de ligne de commande pour que le “&” soit transmis au programme.
-dc
Supprime le champ commentaire de l'en-tête JPEG. Notez que le commentaire ne fait pas partie de l'en-tête Exif.
-de
supprime entièrement l'en-tête Exif. Les autres sections (IPTC, XMP, commentaires) restent intactes.
-di
Supprime la section IPTC (si elle existe). Les autres sections restent intactes.
-dx
Supprime la section XMP (si elle existe). Les autres sections restent intactes.
-du
Supprime toutes les sections que jhead ne connaît pas. Laisse les sections Exif, XMP, IPTC et les commentaires intacts.
-purejpg
efface toutes les sections JPEG inutiles pour le rendu de l'image. Supprime les métadonnées que diverses applications ont pu laisser dans l'image. Combinaison des options -de -dc et -du.
-mkexif
Crée un en-tête Exif minimal.
L'en-tête Exif ne contient que la date et l'heure, ainsi que des champs vides pour les vignettes.
La date et l'heure sont réglées par défaut sur l'heure du fichier.
à utiliser avec l'option -rgt si vous souhaitez que l'en-tête Exif contienne une vignette.
A noter que la création d'en-têtes Exif est très limitée actuellement, et qu'aucun autre champ ne peut être ajouté ainsi à l'en-tête Exif.
-ce
éditer le champ de commentaire de l'en-tête JPEG (ce champ de commentaire est en dehors de la structure Exif et peut faire partie d'images JPEG de style Exif ou non Exif).
Un fichier temporaire contenant le commentaire est créé et un éditeur de texte est lancé pour modifier le fichier.
La variable d'environnement EDITOR spécifie l'éditeur.
Si rien n'est spécifié, notepad ou vi sont utilisés respectivement sous Windows ou UNIX.
Après la fermeture de l'éditeur, les données sont renvoyées dans l'image et le fichier temporaire est supprimé.
-cs <name>
Enregistrer la section des commentaires dans un fichier
-ci <name>
Remplacer le commentaire par le texte du fichier.
-cl <comment>
Remplacer le commentaire par le commentaire en ligne de commande.

Manipulation de la date et de l'heure

-ft
Fixe l'horodatage système du fichier à celui qui est stocké dans l'en-tête Exif.
-dsft
Fixe l'horodatage Exif à celui du fichier. Requiert la préexistence d'un en-tête Exif. Utilisez l'option -mkexif pour en créer un si nécessaire.
-n[<fmt-string>]
Cette option renomme et/ou déplace les fichiers selon le champ “DateTimeOriginal” de l'en-tête Exif. Si le fichier n'est pas de type Exif ou si le champ DateTimeOriginal ne contient pas de valeur valide, c'est la date du fichier qui est utilisée.
Si le nom comprend '/' ou '\' (sous Windows), il est interprété comme un nouveau chemin pour le fichier. Si le nouveau chemin n'existe pas, il sera créé.
Si la chaîne [fmt-string] est omise, le fichier sera renommé en MMDD-HHMMSS.
Si une [chaîne fmt] est fournie, elle sera transmise à la fonction strftime pour le formatage. En outre, si la chaîne de format contient “%f”, elle sera remplacée par le nom original du fichier (sans l'extension).
Un numéro de séquence peut également être inclus en incluant “%i” dans la chaîne de format. Des zéros initiaux peuvent être spécifiés. '%03i', par exemple, remplacera les nombres par '001', '002'… Cela fonctionne comme printf en C, mais avec '%i' au lieu de '%d'.
Si le nom de la cible existe déjà, il sera complété par “a”, “b”, “c”, etc., sauf si le nom se termine par une lettre, auquel cas il sera complété par “0”, “1”, “2”, etc.
Cette fonction est particulièrement utile si plusieurs appareils photo numériques ont été utilisés pour prendre des photos d'un événement. En les renommant selon un schéma basé sur la date, elles apparaîtront automatiquement dans l'ordre de prise de vue lorsqu'elles seront visualisées avec une visionneuse telle que Xnview ou AcdSee, et triées par nom. Vous pouvez également utiliser l'option -ft et afficher les images triées par date. Généralement, l'une des dates de l'appareil photo n'est pas réglée correctement, auquel cas vous devrez peut-être utiliser les options -ta ou -da sur ces fichiers en premier lieu.
Les arguments les plus utiles pour strftime sont les suivants :
%d
Jour du mois sous forme décimale (01 - 31)
%H
Heure au format 24 heures (00 - 23)
%j
Jour de l'année sous forme décimale (001 - 366)
%m
Mois sous forme décimale (01 - 12)
%M
Minute sous forme décimale (00 - 59)
%S
Seconde sous forme décimale (00 - 59)
%U
Semaine de l'année sous forme décimale, avec le dimanche comme premier jour de la semaine (00 - 53)
%w
Jour de la semaine sous forme décimale (0 - 6 ; dimanche étant 0)
%y
Année sans le siècle, sous forme décimale (00 - 99)
%Y
Année avec le siècle, sous forme décimale
Exemple:

USER@MACHINE:~$ jhead -n%Y%m%d-%H%M%S *.jpg

Renommera les fichiers correspondant à *.jpg selon le format AAAAMMJJ-HHMMSS.

Note destinée aux utilisateurs de fichiers batch de Windows : '%' sert à délimiter les macros dans les fichiers batch de Windows. Vous devez utiliser \%\% pour qu'un % soit transmis au programme. Ainsi, dans un fichier batch, vous devriez écrire

USER@MACHINE:~$ jhead -n%Y%%m%d-%H%%M%%S *.jpg

Pour une liste complète des arguments de strftime, consultez la fonction strftime. Notez que certains arguments de la fonction strftime (non répertoriés ici) produisent des chaînes contenant des caractères tels que '/' et ':' qui peuvent ne pas être valides en tant que partie d'un nom de fichier sur certains systèmes.
-a (Windows only option)
Renommer des fichiers portant le même nom mais avec une extension différente. Cette option permet de renommer les fichiers .AVI en fonction du fichier Exif en .THM, ou de renommer les fichiers d'annotation sonore ou les fichiers bruts avec les fichiers jpeg. À utiliser avec l'option '-n'.
-ta<timediff>
Ajuste l'heure enregistrée dans l'en-tête Exif par h:mm en avant ou en arrière. Utile si vous avez pris des photos alors que l'appareil n'était pas à la bonne heure, par exemple après un voyage dans un autre fuseau horaire ou lorsque l'heure d'été a changé. Cette option utilise l'heure du champ “DateTimeOriginal” (balise 0x9003), mais définit tous les champs d'heure de l'en-tête Exif avec la nouvelle valeur.
Exemples :
Avancer de 1 heure (utilisé si vous avez oublié de régler l'heure d'été sur l'appareil photo)

USER@MACHINE:~$ jhead -ta+1:00 *.jpg

Reculer l'heure de 23 secondes (pour synchroniser les horodatages de deux caméras après avoir constaté qu'ils n'étaient pas tout à fait alignés).

USER@MACHINE:~$ jhead -ta-0:00:23 *.jpg

Adjust time forward by 2 days and 1 hour (49 hours)

USER@MACHINE:~$ jhead -ta+49 *.jpg

-da<date>-<date>
fonctionne comme -ta, mais pour spécifier des décalages de date importants, pour corriger des dates provenant d'appareils photo dont la date a été mal réglée, par exemple lorsque la date et l'heure ont été réinitialisées par le retrait de la batterie sur certains appareils photo. Cette fonction permet d'ajuster les dates des photos prises sur une large plage de dates. Pour les photos prises à la même date, l'option “-ds” est souvent plus facile à utiliser.
Comme les mois et les années ne comportent pas tous le même nombre de jours, une simple compensation pour les mois, les jours et les années pourrait donner des résultats inattendus. Le décalage temporel est spécifié sous la forme d'une différence entre deux dates, pour permettre à jhead de déterminer exactement le nombre de jours dont l'horodatage doit être ajusté, en tenant compte des années bissextiles et des changements d'heure d'été. Les dates sont spécifiées sous la forme aaaa:mm:jj. Pour les ajustements inférieurs à un jour, l'heure peut également être incluse en spécifiant aaaa:nn:jj/hh:mm ou aaaa:mm:jj/hh:mm:ss.
Exemples :
L'année de l'appareil photo a été fixée à 2004 au lieu de 2005 pour les photos prises en avril.

USER@MACHINE:~$ jhead -da2005:03:01-2004:03:01

La date par défaut de l'appareil photo est 2002:01:01, et la date a été réinitialisée le 2005:05:29 à 11:21 :

USER@MACHINE:~$ jhead -da2005:05:29/11:21-2002:01:01

-ts<date-time>
Définit la date et l'heure stockées dans l'en-tête Exif selon ce qui est spécifié sur la ligne de commande. Cette option modifie tous les champs de date de l'en-tête Exif. L'heure doit être spécifiée sous la forme :
aaaa:mm:dd-hh:mm:ss

-tf <filename>
Définit la date stockée dans l'en-tête Exif selon l'heure de modification d'un fichier. Cette option modifie tous les champs de date de l'en-tête Exif.
-ds<date-time>
Définit la date stockée dans l'en-tête Exif selon ce qui est spécifié sur la ligne de commande. Permet de définir la date, l'année et le mois, ou l'année uniquement. La date est spécifiée comme :

aaaa:mm:dd, aaaa:mm

, or

aaaa

Options de manipulation des miniatures

-dt
Supprime les miniatures de l'en-tête Exif, mais laisse les parties intéressantes intactes.
Cette option tronque la miniatures de l'en-tête Exif, à condition que la vignette soit la dernière partie de l'en-tête Exif (ce qui, à ma connaissance, est toujours le cas).
Les en-têtes Exif ont une vignette intégrée, qui mesure généralement 240×160 et 10k.
Cette vignette est utilisée par les appareils photo numériques.
Windows XP, ainsi que divers logiciels de visualisation de photos, peuvent également utiliser cette vignette si elle est présente, mais fonctionnent très bien si ce n'est pas le cas.
-st <name>
Save the built in thumbnail from Jpegs that came from a digital camera. The thumbnail lives inside the Exif header, and is a very low-res JPEG image. Note that making any changes to a photo, except for with some programs, generally wipes out the Exif header and with it the thumbnail.

I implemented this option because I kept getting asked about having such an option. I don't consider the built in thumbnails to be all that useful - too low res. However, now you can see for yourself. I always generate my thumbnails using ImageMagick (see end of this page). Like the '-te' option, this feature has the 'relative path' option for specifying the thumbnail name. Whenever the <name> contains the characters '&i', jhead will substitute the original filename for this name. This allows creating a 'relative name' when doing a whole batch of files. For example, the incantation:

  jhead -st "thumbnails\&i" *.jpg

would create a thumbnail for each .jpg file in the thumbnails directory by the same name, (provided that the thumbnails directory exists, of course). Both Win32 and most UNIX shells treat the '&' character in a special way, so you have to put quotes around that command line option for the '&' to even be passed to the program.

If a '-' is specified for the output file, the thumbnail is sent to stdout. (UNIX build only) -rt <name> Replace thumbnails from the Exif header. This only works if the Exif header already contains an Exif header a thumbnail. -rgt[size] Regenerate Exif thumbnail. 'size' specifies maximum height or width of thumbnail. I added this option because I had a lot of images that I had rotated with various tools that don't update the Exif header. But newer image browsers such as XnView make use of the Exif thumbnail, and so the thumbnails would be different from the image itself. Note that the rotation tag also needed to be cleared (-norot option). Typically, only images that are shot in portrait orientation are afflicted with this. You can use the -orp option to tell jhead to only operate on images that are upright.

This option relies on 'mogrify' program (from ImageMagick) to regenerate the thumbnail. Linux users often already have this tool pre-installed. Windows users have to go and download it. This option only works if the image already contains a thumbnail. Rotation tag manipulation -autorot Using the 'Orientation' tag of the Exif header, rotate the image so that it is upright. The program 'jpegtran' is used to perform the rotation. This program is present in most Linux distributions. For windows, you need to get a copy of it. After rotation, the orientation tag of the Exif header is set to '1' (normal orientation). The Exif thumbnail is also rotated. Other fields of the Exif header, including dimensions are untouched, but the JPEG height/width are adjusted. This feature is especially useful with newer digital cameras, which set the orientation field in the Exif header automatically using a built in orientation sensor in the camera. -norot Clears the Exif header rotation tag without altering the image. You may find that your images have rotation tags in them from your camera, but you already rotated them with some lossless tool without clearing the rotation tag. Now your friendly browser rotates the images on you again because the image rotation tag still indicates the image should be rotated. Use this option to fix this problem. You may also want to regenerate the thumbnail using the -rgt option. Output verbosity control -h Displays summary of command line options. -v Makes the program even more verbose than it already is. Like DOS programs, and unlike UNIX programs, Jhead gives feedback as to what it is doing, even when nothing goes wrong. Windows user that I am, when something doesn't give me feedback for 20 seconds, I assume its crashed. -q Makes the program not spit out messages on success - more like the “Silence is golden” Unix way. its crashed. -V Print version info and compilation date. -exifmap Show a map of the bytes in the Exif header. Useful when analyzing strange Exif headers, not of much use to non software developers. -se Suppress error messages relating to corrupt Exif header structure. -c Concise output. This causes picture info to be summarized on one line instead of several. Useful for grep-ing through images, as well as importing into spread sheets (data is space delimited with quotes as text qualifier). File matching and selection -model <model> Restricts processing of files to those whose camera model, as indicated by the Exif image information, contains the substring specified in the argument after '-model'. For example, the following command will list only images that are from an S100 camera:

jhead -model S100 *.jpg

I use this option to restrict my JPEG re-compressing to those images that came from my Cannon S100 camera, (see the -cmd option). -quality <nn> Restricts processing of files to those whose estimated quality factor is equal to or higher than the specified number nn. -exonly Skip all files that don't have an Exif header. This skips all files that did not come directly from the digital camera, as most photo editing software does not preserve the Exif header when saving pictures. -cmd<command> Executes the specified command on each Jpeg file to be processed.

The Exif section of each file is read before running the command, and re-inserted after the command finishes.

This is useful for using Jhead's file globbing capability for processing a whole directory tree of files.

It's also useful for restoring the exif header after operations that wipe out the Exif metadata. Most programs today however will keep the Exif metadata intact, so this is less important than it used to be. -orp, -orl Operate only on images with portrait (-orp) or landscape (-orl) aspect ratio. Please note that this is solely based on jpeg width and height values. Some browsers may auto rotate the image on displaying it based on the Exif orientation tag, so that images shot in portrait mode are displayed as portrait. However, the image itself may not be stored in portrait orientation. The -autorot and -norot options are useful for dealing with rotation issues. -r The recursive feature of version 1.0 never worked to my satisfaction, and I replaced it with my recursive file globbing code in the Windows version. See below. Bugs and Shortcomings

  After Jhead runs a program to rotate or resize an image, the image dimensions and thumbnail in the Exif header are not adjusted.
  Modifying of Exif header data is very limited, as Jhead internally only has a read only implementation of the file system contained in the Exif header. For the most part, Exif can only modify pre-existing fixed-length fields in the header.
  Most Canon digital SLR cameras fail to adjust the effective sensor resolution when shooting at less than full resolution, causing Jhead to incorrectly miscalculate the sensor width and 35mm equivalent focal length. The same can result from resizing photos with Photoshop, which will manipulate parts of the Exif header. This is often reported as a bug in Jhead, but Jhead can't do much about incorrect data. 

Name globbing and recursive directories under Windows

  Name globbing means matching wildcard patterns to actual file names. If you know what this term means, you are probably annoyed at how programs on Windows typically handle this. The Win32 version of this program goes beyond the pattern matching that Windows provides, and allows you to specify fancy UNIX-like patterns such as:
    jhead c:\pix\199*\*\*.jpg
  This program goes one step beyond beyond that in that "**" as a path component means any level of subdirectories. The invocation
    jhead c:\**\*.jpg
  will find ALL Jpegs files on the c: drive, including those in the root directory. The ** only works if it is the only part of that path component. For example, the path 'c:\a**\*.jpg' will not recurse. The '**' recursive expansion is ONLY supported on the Windows version. The code is in the module 'myglob.c', if you want to reuse it (I certainly intend to reuse that code for other applications). Under UNIX, the shell's wildcard expansion is pretty decent already, and dealing with the convoluted nature of some UNIX file layouts, doing better would have been much more of a challenge. 

Programs I use with Jhead ImageMagick

  I use the MOGIRIFY command from ImageMagick to do batch conversions and re-compresses of images. If you use Linux, you probably already have ImageMagick on your system (just type 'mogrify' at the command prompt to see if you have it). For Windows users, you have to download it from: http://www.imagemagick.org
  Image Magick is one of those programs that preserves comment and Exif headers, although older versions do not. 

JPEGTRAN

  If you use Linux you probably also already have this program. For windows, it's hard to find a pre-built binary on the web. The Independent JPEG Group's website only has the source code.
  There's a fancier version, with pre-built Windows binaries and a lossless cropping feature added at: http://sylvana.net/jpegcrop. 

XnView

  XnView is an excellent, small, fast, and free graphical image browser. It makes use of jpeg thumbnails for the thumbnail view. On account of Xnview, I added options to fix or regenerate the thumbnails to jhead, so that I could regenerate the thumbnails for images where the thumbnail had gotten out of sync with the image.
  Mac and Linux versions of XnView are also available. 

wrjpgcom / rdjpgcom

  You can use these programs to write and extract COM markers from JPEG images respectively. Although I always use my jhead program for this feature, the wrjpgcom and rdjpgcom programs are extremely simple and very suitable for use with shell scripts to process lots of images. These programs are part of most Linux distributions as part of the libjpg package (along with jpegtran) 

Utilisation

Options en ligne de commande

Exemple de sortie jhead :

...@...:~$ jhead 0805-153933.jpg
    File name    : 0805-153933.jpg
    File size    : 463023 bytes
    File date    : 2001:08:12 21:02:04
    Camera make  : Canon
    Camera model : Canon PowerShot S100
    Date/Time    : 2001:08:05 15:39:33
    Resolution   : 1600 x 1200
    Flash used   : No
    Focal length :  5.4mm  (35mm equivalent: 36mm)
    CCD Width    : 5.23mm
    Exposure time: 0.100 s  (1/10)
    Aperture     : f/2.8
    Focus Dist.  : 1.18m
    Metering Mode: center weight
    Jpeg process : Baseline

Le programme dispose de nombreuses options en ligne de commande pour manipuler les fichiers Exif, telles que des options pour manipuler la date dans l'en-tête, renommer les fichiers image ou coordonner l'exécution de Jpegtran et Mogrify pour manipuler des arborescences entières de répertoires d'images.

Désinstallation

Problèmes connus

Voir aussi


Basé sur « Jhead is a command line driven program for manipulating the non-image parts of Exif flavour JPEG files that most digital cameras produce » par sentex.ca/~mwandel.