我使用 imagemagick 为我的照片添加水印。命令行如下:
composite -tile -gravity center watermark.png somefile.jpg somefile.jpg
但水印不是垂直居中的。它看起来像这样:
我希望它从中心开始。我该怎么做?
答案1
首先,获取基础图像和水印图像的尺寸:
#!/bin/bash
infile="$1"
outfile="$2"
wmfile="watermark.png"
basew=`identify -format '%w' "$infile"`
baseh=`identify -format '%h' "$infile"`
wmw=`identify -format '%w' "$wmfile"`
wmh=`identify -format '%h' "$wmfile"`
然后,计算我们可以在基础图像上放置多少个完整的图块:
tilew=$(($basew / $wmw * $wmw))
tileh=$(($baseh / $wmh * $wmh))
这使用整数运算,因此乘法运算不会抵消除法。让我们举个例子。如果基本图像为 100x100,图块图像为 34x34,则这将产生 68x68,因为您无法在任一轴上完全容纳第三个图块。
请注意,我们在这里使用 Bash 功能在 shell 脚本中进行算术运算。如果您必须在另一个 shell 中执行此操作,您可以调用bc
或dc
在外部进行计算。
现在我们知道可以将其设置为多大,创建水印图像的平铺临时版本,以等于基本图像大小的框架为中心:
wmtemp=`mktemp /tmp/wm-XXXXXX.png`
convert -background 'rgba(0,0,0,0)' -size "$tilew"x"$tileh" \
tile:"$wmfile" -gravity center -extent "$basew"x"$baseh" \
png32:$wmtemp
请注意,这会强制水印图像采用 RGBA 格式(如果尚未采用)。此外,该-background 'rgba(0,0,0,0)'
指令位于输入图像之前也很重要,因此它不会在默认白色背景上执行平铺操作。
不过,这里真正的技巧是我们对-size
和-extent
指令使用不同的值。我们正在构建一个可能更小的平铺图像,然后根据需要将其填充以匹配基本图像的大小。如果平铺图像大小均匀地划分为基本图像大小,那就很好,它不需要添加任何额外的填充来使平铺集居中。
最后,将临时平铺水印放置在原始图像上:
composite "$wmtemp" "$infile" "$outfile"
rm "$wmtemp"