Answers:
如果您想将图像文件的创建日期写入图像本身(如果不是您想要的,请编辑问题),可以使用imagemagick
。
如果尚未安装,请安装ImageMagick:
sudo apt-get install imagemagick
运行bash循环,该循环将获取每张照片的创建日期,并convert
从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
的右下角带有时间戳。对于多种文件类型和漂亮的输出名称,您可以更优雅地执行此操作,但是语法稍微复杂一些:
好的,那是简单的版本。我编写了一个脚本,可以处理更复杂的情况,子目录中的文件,怪异的文件名等。据我所知,只有.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
"$path"/"${name/%.*/.time.$ext}"
吗?特别是/%.*/
部分。另外,如果我想将“时间”部分放在前面,例如time.a.jpg而不是a.time.jpg,该怎么办?
请查看http://jambula.sourceforge.net/以批处理在不同格式和语言的jpeg图像上插入拍摄日期/时间/评论。特色是日期戳无损。Linux和Mac也支持它。
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.
另外,我还没有决定是否要使用子目录。你能展示一下如何使用find
吗?谢谢!