Wenn Sie das Erstellungsdatum der Bilddatei in das Bild selbst schreiben möchten (wenn dies nicht gewünscht ist, bearbeiten Sie bitte Ihre Frage), können Sie verwenden imagemagick
.
Installieren Sie ImageMagick, falls noch nicht installiert:
sudo apt-get install imagemagick
Führen Sie eine Bash-Schleife aus, die das Erstellungsdatum jedes Fotos abruft, und verwenden Sie es convert
aus der imagemagick
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
Dadurch wird für jedes benannte Bild foo.jpg
eine Kopie time_foo.jpg
mit dem Zeitstempel unten rechts erstellt. Sie können dies eleganter tun, 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 sich mit komplexeren Situationen, Dateien in Unterverzeichnissen, seltsamen Dateinamen usw. befassen kann. Soweit ich weiß, können nur PNG- und TIF-Bilder EXIF-Daten enthalten, sodass es keinen Sinn macht, dies in anderen Formaten auszuführen . Als mögliche Problemumgehung können Sie jedoch das Erstellungsdatum der Datei anstelle der EIF-Daten verwenden. Dies ist sehr wahrscheinlich nicht dasselbe wie das Datum, an dem das Bild aufgenommen wurde, sodass im entsprechenden Skript der entsprechende 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
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.
Außerdem habe ich mich noch nicht entschieden, ob ich Unterverzeichnisse verwenden möchte. Könntest du auch zeigen, wie man es benutztfind
? Vielen Dank!