Wenn Sie das Erstellungsdatum der Bilddatei in das Bild selbst schreiben möchten (wenn Sie das nicht möchten, bearbeiten Sie bitte Ihre Frage), können Sie imagemagick
verwenden .
-
Installieren Sie ImageMagick, falls es noch nicht installiert ist:
sudo apt-get install imagemagick
-
Führen Sie eine Bash-Schleife aus, die das Erstellungsdatum jedes Fotos erhält, und verwenden Sie
convert
abimagemagick
Suite, um das Bild zu bearbeiten:for img in *jpg; do convert "$img" -gravity SouthEast -pointsize 22 \ -fill white -annotate +30+30 %[exif:DateTimeOriginal] "time_""$img"; done
Für jedes Bild mit dem Namen
foo.jpg
, wird eine Kopie mit dem Namentime_foo.jpg
erstellt mit dem Zeitstempel unten rechts. Sie können dies eleganter machen, für mehrere Dateitypen und schöne Ausgabenamen, aber die Syntax ist etwas komplexer:
OK, das war die einfache Version. Ich habe ein Skript geschrieben, das mit komplexeren Situationen, Dateien in Unterverzeichnissen, seltsamen Dateinamen usw. umgehen kann. Soweit ich weiß, können nur .png- und .tif-Bilder EXIF-Daten enthalten, daher macht es keinen Sinn, dies auf anderen Formaten auszuführen . Als mögliche Problemumgehung können Sie jedoch das Erstellungsdatum der Datei anstelle der EIF-Daten verwenden. Dies ist jedoch sehr wahrscheinlich nicht dasselbe wie das Datum, an dem das Bild aufgenommen wurde, sodass im folgenden Skript der relevante Abschnitt auskommentiert ist. Entfernen Sie die Kommentare, wenn Sie möchten, dass sie auf diese Weise verarbeitet werden.
Speichern Sie dieses Skript unter add_watermark.sh
und führen Sie es in dem Verzeichnis aus, das Ihre Dateien enthält:
bash /path/to/add_watermark.sh
Es verwendet exiv2
die Sie möglicherweise installieren müssen (sudo apt-get install exiv2
). Das Skript:
#!/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