Si desea escribir la fecha de creación del archivo de imagen en la imagen misma (si eso no es lo que desea, edite su pregunta), puede usar imagemagick
.
Instale ImageMagick si aún no está instalado:
sudo apt-get install imagemagick
Ejecute un bucle bash que obtendrá la fecha de creación de cada foto y úsela convert
desde la imagemagick
suite para editar la imagen:
for img in *jpg; do convert "$img" -gravity SouthEast -pointsize 22 \
-fill white -annotate +30+30 %[exif:DateTimeOriginal] "time_""$img";
done
Para cada imagen nombrada foo.jpg
, esto creará una copia llamada time_foo.jpg
con la marca de tiempo en la parte inferior derecha. Puede hacerlo de manera más elegante, para múltiples tipos de archivos y nombres de salida agradables, pero la sintaxis es un poco más compleja:
OK, esa era la versión simple. Escribí un script que puede tratar situaciones más complejas, archivos en subdirectorios, nombres de archivos extraños, etc. Hasta donde sé, solo las imágenes .png y .tif pueden contener datos EXIF, por lo que no tiene sentido ejecutar esto en otros formatos . Sin embargo, como una posible solución alternativa, puede usar la fecha de creación del archivo en lugar de los datos EIF. Es muy probable que esto no sea lo mismo que la fecha en que se tomó la imagen, por lo que el script a continuación tiene la sección relevante comentada. Elimine los comentarios si desea que se procesen de esta manera.
Guarde este script como add_watermark.sh
y ejecútelo en el directorio que contiene sus archivos:
bash /path/to/add_watermark.sh
Utiliza exiv2
lo que puede necesitar instalar ( sudo apt-get install exiv2
). La secuencia de comandos:
#!/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.
Además, aún no he decidido si quiero usar subdirectorios; ¿podría mostrar cómo usarfind
también? ¡Gracias!"$path"/"${name/%.*/.time.$ext}"
hace? En particular, la/%.*/
parte. Además, si quisiera poner la parte "tiempo" al frente, por ejemplo, time.a.jpg en lugar de a.time.jpg, ¿cómo podría hacerlo?.
carácter con.time.$ext
($ext
es la extensión capturada anteriormente). Para hacerlotime.a.jpg
, cambia eso a${name/#/time.}
.Visite http://jambula.sourceforge.net/ para insertar por lotes la fecha / hora / comentario del disparo en una imagen jpeg en diferentes formatos e idiomas. Una característica especial es que el sello de fecha no tiene pérdidas. También es compatible con Linux y Mac.
fuente
Simplemente trace los archivos en un directorio vacío y canalice AWK al shell. Tal vez un poco viejo pero mucho menos elegante, muchos menos caracteres para escribir también, por ejemplo:
fuente