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
.
Installa ImageMagick se non è già installato:
sudo apt-get install imagemagick
Esegui un ciclo bash che otterrà la data di creazione di ogni foto e utilizzi convert
dalla imagemagick
suite 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.jpg
con 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.sh
ed eseguirlo nella directory che contiene i file:
bash /path/to/add_watermark.sh
Utilizza exiv2
ciò 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
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 usarefind
? Grazie!