画像ファイルの作成日を画像自体に書き込みたい場合 (それが必要ない場合は、質問を編集してください)、 imagemagick
を使用できます .
まだインストールされていない場合は、ImageMagick をインストールします。
sudo apt-get install imagemagick
各写真の作成日を取得して convert
を使用する bash ループを実行します imagemagick
から 画像編集スイート:
for img in *jpg; do convert "$img" -gravity SouthEast -pointsize 22 \
-fill white -annotate +30+30 %[exif:DateTimeOriginal] "time_""$img";
done
foo.jpg
という名前の各画像 、これにより time_foo.jpg
というコピーが作成されます 右下にタイムスタンプ。複数のファイル タイプと適切な出力名に対して、これをよりエレガントに行うことができますが、構文はもう少し複雑です:
OK、それは単純なバージョンでした。より複雑な状況、サブディレクトリ内のファイル、奇妙なファイル名などに対処できるスクリプトを作成しました。私の知る限り、.png および .tif 画像のみが EXIF データを含むことができるため、他の形式でこれを実行しても意味がありません。 .ただし、考えられる回避策として、EIF データの代わりにファイルの作成日を使用できます。これは、画像が撮影された日付と同じではない可能性が非常に高いため、以下のスクリプトでは関連するセクションがコメントアウトされています.このように処理したい場合は、コメントを削除してください。
このスクリプトを add_watermark.sh
として保存します ファイルを含むディレクトリで実行します:
bash /path/to/add_watermark.sh
exiv2
を使用しています インストールが必要な場合があります (sudo apt-get install exiv2
)。スクリプト:
#!/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