给图片加时间戳水印

在安装了 imageMagick 之后,可以使用命令来对图片进行修改。

例如,给图片加时间戳水印。需要使用到 convert 这个命令。

我在网上看到的教程,有教使用 %[exif:datetime]%[exif:dateTimeOriginal]这些参数的。

但是我尝试之后都失败了。因为并不是所有的图片都有这些信息。

我们可以使用这个命令

identify -verbose your_image.jpg

来查看图片有哪些元数据,这是我的一张图片,是使用命令行捕获摄像头画面保存下来的,信息比用相机拍的图片少很多。

Properties:
date:create: 2023-03-26T06:45:38+00:00
date:modify: 2023-03-26T06:45:38+00:00
date:timestamp: 2023-03-28T07:43:40+00:00
jpeg:colorspace: 2

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:
date:create: 2022-11-23T09:29:46+00:00
date:modify: 2022-07-05T06:35:22+00:00
date:timestamp: 2023-03-28T13:22:40+00:00
exif:BrightnessValue: 13884/2560
exif:ColorSpace: 1
exif:ComponentsConfiguration: ...
exif:CompressedBitsPerPixel: 1/1
exif:Contrast: 0
exif:CustomRendered: 0
exif:DateTime: 2022:07:05 14:35:23
exif:DateTimeDigitized: 2022:07:05 14:35:23
exif:DateTimeOriginal: 2022:07:05 14:35:23
exif:DigitalZoomRatio: 16/16
...

如果我们要加时间戳,直接使用这样的时间就行了。因此我建议先查看一下,图片有哪些元数据可以用,再看看选择哪个比较好。


记录我遇到的一个坑,使用下面的命令,在 zsh 里面都会报错。

$ convert snapshot.jpg -gravity SouthEast -fill yellow -pointsize 20 -annotate +1+1  %[date:create] temp.jpg

zsh: no matches found: %[date:create]

这个错误是因为 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。

具体的操作包括:

  1. -gravity SouthEast:将文字水印放在东南方,也就是图片的右下角。
  2. -fill yellow:将文字水印的颜色设置为黄色。
  3. -pointsize 20:设置文字水印的字体大小为 20。
  4. -annotate +1+1:往左和上偏移 1 个像素。
  5. "%[date:create]":将图片创建日期和时间作为文字水印的内容,这里使用了 ImageMagick 的内置变量 %[date:create],它会从图片的元数据中读取日期和时间信息。
  6. 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 像素,最终的效果是这样的。

vr-add-timestamp