Jika Anda ingin menulis tanggal pembuatan file gambar ke dalam gambar itu sendiri (jika bukan itu yang Anda inginkan, harap edit pertanyaan Anda), Anda dapat menggunakan imagemagick
.
Instal ImageMagick jika belum diinstal:
sudo apt-get install imagemagick
Jalankan bash loop yang akan mendapatkan tanggal pembuatan setiap foto dan gunakan convert
dari imagemagick
suite untuk mengedit gambar:
for img in *jpg; do convert "$img" -gravity SouthEast -pointsize 22 \
-fill white -annotate +30+30 %[exif:DateTimeOriginal] "time_""$img";
done
Untuk setiap gambar bernama foo.jpg
, ini akan membuat salinan yang disebut time_foo.jpg
dengan cap waktu di kanan bawah. Anda dapat melakukan ini dengan lebih elegan, untuk beberapa jenis file dan nama output yang bagus tetapi sintaksnya sedikit lebih kompleks:
OK, itu versi sederhana. Saya menulis sebuah skrip yang dapat menangani situasi yang lebih kompleks, file dalam sub direktori, nama file aneh dll. Sejauh yang saya tahu, hanya gambar .png dan .tif yang dapat berisi data EXIF sehingga tidak ada gunanya menjalankan ini pada format lain . Namun, sebagai solusi yang memungkinkan Anda dapat menggunakan tanggal pembuatan file alih-alih data EIF. Ini sangat mungkin tidak sama dengan tanggal pengambilan gambar sehingga skrip di bawah ini memiliki bagian yang relevan berkomentar. Hapus komentar jika Anda ingin memprosesnya dengan cara ini.
Simpan skrip ini sebagai add_watermark.sh
dan jalankan di direktori yang berisi file Anda:
bash /path/to/add_watermark.sh
Menggunakan exiv2
yang Anda mungkin perlu menginstal ( sudo apt-get install exiv2
). Naskah:
#!/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.
Juga, saya belum memutuskan apakah saya ingin menggunakan subdirektori; Bisakah Anda menunjukkan cara menggunakanfind
juga? Terima kasih!