Nếu bạn muốn ghi ngày tạo của tệp hình ảnh vào chính hình ảnh (nếu đó không phải là điều bạn muốn, vui lòng chỉnh sửa câu hỏi của bạn), bạn có thể sử dụng imagemagick
.
Cài đặt ImageMagick nếu chưa được cài đặt:
sudo apt-get install imagemagick
Chạy một vòng lặp bash sẽ lấy ngày tạo của mỗi ảnh và sử dụng convert
từ imagemagick
bộ để chỉnh sửa ảnh:
for img in *jpg; do convert "$img" -gravity SouthEast -pointsize 22 \
-fill white -annotate +30+30 %[exif:DateTimeOriginal] "time_""$img";
done
Đối với mỗi hình ảnh được đặt tên foo.jpg
, điều này sẽ tạo ra một bản sao được gọi time_foo.jpg
với dấu thời gian ở phía dưới bên phải. Bạn có thể làm điều này một cách thanh lịch hơn, đối với nhiều loại tệp và tên đầu ra đẹp nhưng cú pháp phức tạp hơn một chút:
OK, đó là phiên bản đơn giản. Tôi đã viết một tập lệnh có thể xử lý các tình huống phức tạp hơn, các tệp trong thư mục con, tên tệp lạ, v.v. Theo tôi biết, chỉ có hình ảnh .png và .tif có thể chứa dữ liệu EXIF nên không có điểm nào để chạy trên các định dạng khác . Tuy nhiên, như một cách giải quyết có thể, bạn có thể sử dụng ngày tạo tệp thay vì dữ liệu EIF. Điều này rất có thể không giống với ngày hình ảnh được chụp mặc dù vậy kịch bản dưới đây có phần liên quan được nhận xét. Xóa các bình luận nếu bạn muốn nó xử lý theo cách này.
Lưu tập lệnh này dưới dạng add_watermark.sh
và chạy nó trong thư mục chứa các tệp của bạn:
bash /path/to/add_watermark.sh
Nó sử dụng exiv2
mà bạn có thể cần phải cài đặt ( sudo apt-get install exiv2
). Kịch bản:
#!/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.
Ngoài ra, tôi vẫn chưa quyết định liệu tôi có muốn sử dụng các thư mục con chưa; bạn có thể chỉ cho bạn cách sử dụngfind
không? Cảm ơn!