Ajouter un horodatage à l'image à partir de la ligne de commande Linux

9

J'ai un dossier plein d'images. J'essaie d'ajouter un horodatage sur l'image elle-même, pour chaque image, en fonction de la date de création du fichier. Est-ce possible? J'ai lu cet article ici , mais il utilise des données exif. Mes images n'ont pas de données exif.

Puis-je ajouter directement un horodatage à l'aide de la date de création? Ou dois-je utiliser des données exif? Si je dois utiliser des données exif, comment pourrais-je les écrire en utilisant la date de création?

J'utilise Ubuntu Server sans interface graphique, j'ai donc besoin d'une solution en ligne de commande. Quelqu'un peut-il aider? Merci!

Andrew
la source

Réponses:

18

Si vous souhaitez écrire la date de création du fichier image dans l'image elle-même (si ce n'est pas ce que vous voulez, veuillez modifier votre question), vous pouvez utiliser imagemagick.

  1. Installez ImageMagick s'il n'est pas déjà installé:

    sudo apt-get install imagemagick
    
  2. Exécutez une boucle bash qui obtiendra la date de création de chaque photo et utilisera à convertpartir de la imagemagicksuite pour éditer l'image:

    for img in *jpg; do convert "$img" -gravity SouthEast -pointsize 22 \
       -fill white -annotate +30+30  %[exif:DateTimeOriginal] "time_""$img"; 
    done
    

    Pour chaque image nommée foo.jpg, cela créera une copie appelée time_foo.jpgavec l'horodatage en bas à droite. Vous pouvez le faire plus élégamment, pour plusieurs types de fichiers et de beaux noms de sortie, mais la syntaxe est un peu plus complexe:

OK, c'était la version simple. J'ai écrit un script qui peut gérer des situations plus complexes, des fichiers dans des sous-répertoires, des noms de fichiers étranges, etc. Pour autant que je sache, seules les images .png et .tif peuvent contenir des données EXIF, il est donc inutile de les exécuter sur d'autres formats. . Cependant, comme solution de contournement possible, vous pouvez utiliser la date de création du fichier au lieu des données EIF. Ce n'est probablement pas la même que la date à laquelle l'image a été prise, donc le script ci-dessous a mis en commentaire la section appropriée. Supprimez les commentaires si vous souhaitez qu'il soit traité de cette manière.

Enregistrez ce script sous add_watermark.shet exécutez-le dans le répertoire qui contient vos fichiers:

bash /path/to/add_watermark.sh

Il utilise exiv2ce que vous devrez peut-être installer ( sudo apt-get install exiv2). Le scénario:

#!/usr/bin/env bash

## This command will find all image files, if you are using other
## extensions, you can add them: -o "*.foo"
find . -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.tif" -o \
 -iname "*.tiff" -o -iname "*.png" | 

## Go through the results, saving each as $img
while IFS= read -r img; do
    ## Find will return full paths, so an image in the current
    ## directory will be ./foo.jpg and the first dot screws up 
    ## bash's pattern matching. Use basename and dirname to extract
    ## the needed information.
    name=$(basename "$img")
    path=$(dirname "$img")
    ext="${name/#*./}"; 

    ## Check whether this file has exif data
    if exiv2 "$img" 2>&1 | grep timestamp >/dev/null 
    ## If it does, read it and add the water mark   
    then
    echo "Processing $img...";
    convert "$img" -gravity SouthEast  -pointsize 22 -fill white \
             -annotate +30+30  %[exif:DateTimeOriginal] \
             "$path"/"${name/%.*/.time.$ext}";
    ## If the image has no exif data, use the creation date of the
    ## file. CAREFUL: this is the date on which this particular file
    ## was created and it will often not be the same as the date the 
    ## photo was taken. This is probably not the desired behaviour so
    ## I have commented it out. To activate, just remove the # from
    ## the beginning of each line.

    # else
    #   date=$(stat "$img" | grep Modify | cut -d ' ' -f 2,3 | cut -d ':' -f1,2)
    #   convert "$img" -gravity SouthEast  -pointsize 22 -fill white \
    #          -annotate +30+30  "$date" \
    #          "$path"/"${name/%.*/.time.$ext}";
    fi 
done
terdon
la source
C'est exactement ce que je recherche! Cependant, j'obtiens la sortie suivante: convert.im6: unknown image property "%[exif:DateTimeOriginal]" @ warning/property.c/InterpretImageProperties/3245. convert.im6: unable to open image `{img/%.*/.time.jpg}': No such file or directory @ error/blob.c/OpenBlob/2638.De plus, je n'ai pas encore décidé si je veux utiliser des sous-répertoires; pourriez-vous également montrer comment l'utiliser find? Merci!
Andrew
@Andrew, il y a deux problèmes possibles, l'un est que je n'avais pas cité correctement les variables et que les espaces dans les noms de fichiers poseraient des problèmes. Essayez le script dans la réponse mise à jour. Si cela échoue toujours, vos images ne contiennent probablement pas les données EXIF ​​nécessaires, j'ai inclus une (mauvaise) solution de contournement pour cela.
terdon
Cela fait un moment, mais pouvez-vous expliquer ce que "$path"/"${name/%.*/.time.$ext}"fait? En particulier, la /%.*/partie. Aussi, si je voulais mettre la partie "time" devant, par exemple time.a.jpg plutôt que a.time.jpg, comment pourrais-je le faire?
Andrew
@Andrew c'est juste un remplacement de chaîne, voir ici . Il remplacera tout après le dernier .caractère par .time.$ext( $extl'extension est-elle capturée plus tôt). Pour en faire time.a.jpg, changez cela en ${name/#/time.}.
terdon
-pointsize 48 ou -pointsize 72 est certainement plus lisible. :-)
Corey S.
0

Veuillez consulter http://jambula.sourceforge.net/ pour insérer la date / heure / commentaire de prise de vue par lots sur une image jpeg dans différents formats et langues. Une particularité est que le timbre à date est sans perte. Il est également pris en charge sur Linux et Mac.

Suresh Mahalingam
la source
0

Il suffit de tracer les fichiers dans un répertoire vide et de diriger AWK vers le shell. Peut-être un peu oldskool mais beaucoup moins de fantaisies, beaucoup moins de caractères à taper aussi, par exemple:

ls | awk '{print "convert "$0" -gravity SouthEast -pointsize 22 -fill white -annotate +30+30 %[exif:DateTimeOriginal] dated"$0}' | sh
Paul
la source