Aggiungi il timestamp all'immagine dalla riga di comando di Linux


9

Ho una cartella piena di immagini. Sto cercando di aggiungere un timestamp sull'immagine stessa, per ogni immagine, in base alla data di creazione del file. È possibile? Ho letto questo post qui , ma utilizza i dati exif. Le mie immagini non hanno dati exif.

Posso aggiungere direttamente un timestamp utilizzando la data di creazione? O devo usare i dati exif? Se dovessi usare i dati exif, come li scriverei usando la data di creazione?

Sto usando Ubuntu Server senza GUI, quindi avrò bisogno di una soluzione a riga di comando. Qualcuno può aiutare? Grazie!

Risposte:


18

Se vuoi scrivere la data di creazione del file immagine nell'immagine stessa (se non è quello che vuoi, modifica la tua domanda), puoi usare imagemagick.

  1. Installa ImageMagick se non è già installato:

    sudo apt-get install imagemagick
    
  2. Esegui un ciclo bash che otterrà la data di creazione di ogni foto e utilizzi convertdalla imagemagicksuite per modificare l'immagine:

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

    Per ogni immagine nominata foo.jpg, verrà creata una copia chiamata time_foo.jpgcon il timestamp in basso a destra. Puoi farlo in modo più elegante, per più tipi di file e bei nomi di output ma la sintassi è un po 'più complessa:

OK, quella era la versione semplice. Ho scritto uno script in grado di gestire situazioni più complesse, file in sottodirectory, nomi di file strani, ecc. Per quanto ne so, solo le immagini .png e .tif possono contenere dati EXIF, quindi non ha senso eseguirli su altri formati . Tuttavia, come possibile soluzione alternativa, è possibile utilizzare la data di creazione del file anziché i dati EIF. Molto probabilmente questo non è lo stesso della data in cui è stata scattata l'immagine, quindi lo script seguente ha commentato la sezione pertinente. Rimuovere i commenti se si desidera che vengano elaborati in questo modo.

Salvare questo script come add_watermark.shed eseguirlo nella directory che contiene i file:

bash /path/to/add_watermark.sh

Utilizza exiv2ciò che potrebbe essere necessario installare ( sudo apt-get install exiv2). Il copione:

#!/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

Questo è esattamente quello che sto cercando! Tuttavia, sto ottenendo il seguente output: 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.Inoltre, non ho ancora deciso di utilizzare le sottodirectory; potresti mostrare anche come usare find? Grazie!
Andrew,

@Andrew ci sono due possibili problemi, uno è che non avevo citato correttamente le variabili e quindi gli spazi nei nomi dei file avrebbero causato problemi. Prova lo script nella risposta aggiornata. Se le immagini non riescono ancora a contenere probabilmente i dati EXIF ​​necessari, ho incluso una (cattiva) soluzione per questo.
terdon,

È passato un po 'di tempo, ma puoi spiegare cosa "$path"/"${name/%.*/.time.$ext}"fa? In particolare, la /%.*/parte. Inoltre, se volessi mettere in primo piano la parte "time", ad esempio time.a.jpg anziché a.time.jpg, come potrei farlo?
Andrew,

@Andrew è solo la sostituzione della stringa, vedi qui . Sostituirà tutto dopo l'ultimo .carattere con .time.$ext( $extè l'estensione catturata in precedenza). Per farcela time.a.jpg, cambiala in ${name/#/time.}.
terdon,

-pointsize 48 o -pointsize 72 è sicuramente più leggibile. :-)
Corey S.

0

Si prega di verificare http://jambula.sourceforge.net/ a lotto inserto di ripresa data / ora / commento un'immagine JPEG in diversi formati e lingue su. Una caratteristica speciale è che il timbro data è senza perdita di dati. È supportato anche su Linux e Mac.


0

Basta tracciare i file in una directory vuota e reindirizzare AWK alla shell. Forse un po 'vecchio ma molto meno fantasioso, molti meno caratteri da scrivere anche, ad esempio:

ls | awk '{print "convert "$0" -gravity SouthEast -pointsize 22 -fill white -annotate +30+30 %[exif:DateTimeOriginal] dated"$0}' | sh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.