在安装了 imageMagick 之后,可以使用命令来对图片进行修改。
例如,给图片加时间戳水印。需要使用到 convert
这个命令。
我在网上看到的教程,有教使用 %[exif:datetime]
、%[exif:dateTimeOriginal]
这些参数的。
但是我尝试之后都失败了。因为并不是所有的图片都有这些信息。
我们可以使用这个命令
identify -verbose your_image.jpg |
来查看图片有哪些元数据,这是我的一张图片,是使用命令行捕获摄像头画面保存下来的,信息比用相机拍的图片少很多。
Properties: |
把 2023-03-26T06:45:38+00:00
这样的时间加到图片上,好像作用不大,因为我们这是 +08:00,弄个 0 时区的时间加上去……
另外还可以不用图片的日期,我想要将当前的时间,直接加到图片上,可以这么写
convert snapshot.jpg -gravity SouthEast -fill yellow -pointsize 20 -annotate +1+1 "`date +'%Y-%m-%d %H:%M:%S'`" temp.jpg |
这样的命令可以把当前时间印在图片上。不过这么用的应该很少,按理说,一般应该使用图片的创建时间,也就是照片拍摄的时间。
如果使用相机、手机拍的照片,一般使用DateTimeOriginal
会比较多。
这是一张使用索尼相机拍的照片,它有这些信息。可以发现
- DateTime
- DateTimeDigitized
- DateTimeOriginal
的时间都是一样的。
Properties: |
如果我们要加时间戳,直接使用这样的时间就行了。因此我建议先查看一下,图片有哪些元数据可以用,再看看选择哪个比较好。
记录我遇到的一个坑,使用下面的命令,在 zsh 里面都会报错。
$ convert snapshot.jpg -gravity SouthEast -fill yellow -pointsize 20 -annotate +1+1 %[date:create] temp.jpg |
这个错误是因为 zsh 默认开启了文件名通配符的功能,其中 %[
是 zsh 文件名通配符的一部分,所以它会认为 %[
是一个通配符,然后去尝试匹配文件名,但是找不到符合这个模式的文件,于是就报错了。
为了解决这个问题,需要把 %[
用引号引起来,例如:
convert snapshot.jpg -gravity SouthEast -fill yellow -pointsize 20 -annotate +1+1 "%[date:create]" temp.jpg |
这样,zsh 就不会把 %[
当成文件名通配符了,而是当成普通的字符串来处理,就不会报错了。
如果你使用的是 bash,就可以不用加。但即使在 bash 里面加了引号,也可以执行的。
解释:
这条命令使用 ImageMagick 的 convert 工具对一张名为 snapshot.jpg 的图片进行操作,并将结果保存为 temp.jpg。
具体的操作包括:
-gravity SouthEast
:将文字水印放在东南方,也就是图片的右下角。-fill yellow
:将文字水印的颜色设置为黄色。-pointsize 20
:设置文字水印的字体大小为 20。-annotate +1+1
:往左和上偏移 1 个像素。"%[date:create]"
:将图片创建日期和时间作为文字水印的内容,这里使用了 ImageMagick 的内置变量 %[date:create],它会从图片的元数据中读取日期和时间信息。temp.jpg
:保存处理后的图片为 temp.jpg。
因此,这条命令的作用是在图片的右下角添加一个黄色文字水印,内容为该图片的创建日期和时间。
我这条命令,是用在分辨率只有 640×480 的图片上的,如果是分辨率高的图片,得改改。
convert DSC00097.JPG -gravity SouthEast -fill yellow -pointsize 200 -annotate +10+10 "%[exif:DateTime]" temp.jpg |
我这张图片的分辨率是 5472 × 3080,所以我把字体大小改为 200,偏移改为 10 像素,最终的效果是这样的。