使用 ImageMagick 轻松添加水印

作者:Dave Taylor

让我们从一些家庭作业开始。去 Google(或 Bing)搜索“隐私已死,接受现实吧”。我第一次听到这句话是从 Sun Microsystems 的联合创始人 Bill Joy 那里听到的,但这归因于许多技术人员,并且其中有一定的道理。将某些东西放在网上,它就进入了公共领域,无论你多么希望将其控制在手中。

不相信吗?问问音乐家、图书作者或电影制作人。现在,那些下载 350 页 PDF 而不是花 14 美元购买印刷书籍的人是否会损害销量,这完全是另一个问题,但互联网是公共和开放的,即使是我们希望不是的部分也是如此。

这意味着,如果你是一位摄影师,或者上传了你想保护或控制的图像,你将面临一项艰巨的任务。是的,你可以在你的网页上添加一些代码,使其无法右键单击保存图像,但在网络世界中完全阻止知识产权盗窃是不可能的。

这就是为什么许多专业摄影师不在线发布大于低分辨率缩略图的图像的原因。你可以想象,靠销售照片(而不是拍摄婚礼)赚钱的婚礼摄影师会非常密切地关注这类事情!

正如人们已经学会为了坦诚和有趣的内容而接受糟糕的视频(这要感谢 YouTube),人们也学会了接受免费的低分辨率图像,而不是为许可权和照片或其他艺术作品的高分辨率版本支付哪怕是象征性的费用。

然而,还有另一种方法,在线图片社公司已经证明了这一点:水印。

你无疑见过带有嵌入式版权声明、网站地址或其他内容的照片,这些内容会破坏图像,但使其更难与原始来源分离。

事实证明,我们的朋友 ImageMagick 非常擅长以各种不同的方式创建这些水印,这正是我在本专栏中探讨的内容。对于许多内容生产者来说,这是一个问题,我知道我不断上传的照片正在被盗用,并在未经许可和未署名的情况下在其他网站上重复使用。

为了做到这一点,基本思路是创建一个仅包含水印的文件,然后将其与原始图像混合以创建一个新图像。幸运的是,创建新图像可以通过包含在 ImageMagick 中的 convert 程序以编程方式完成。

话虽如此,但这确实非常复杂,所以我将从一个相当平淡但快速的方法开始,使用 label: 功能添加水印。简而言之,你指定你想要的文本,你希望它在图像上的位置,输入图像文件名和输出图像文件名。让我们从一张图像开始(图 1)。

图 1. 原始图像,派对上的孩子们

当然,你可以使用 identify 获取图像的尺寸等等


$ identify kids-party.png
kids-party.png PNG 493x360 493x360+0+0 8-bit 
 ↪DirectClass 467KB 0.000u 0:00.000

你可以忽略几乎所有这些;你关心的只是尺寸,它显示为 493x360。

现在,让我们使用 composite 添加一个简单的标签


$ composite label:'AskDaveTaylor.com' kids-party.png \
  kids-party-labelled.png

图 2 显示了应用标签后的图像。

图 2. 已添加标签,无样式

这有点无聊,尽管它以一种基本的方式有效。现在让我们做一些更有趣的事情,首先将文本定位在底部居中,但也在图像下方添加空间用于标题


$ convert kids-party.png -background Khaki \
 label:'AskDaveTaylor.com' \
 -gravity center -append party-khaki.png

在这里,我为新文本添加了背景颜色(卡其色),并利用了复杂但非常有用的 gravity 功能,使文本在新 append(附加)图像空间内居中。图 3 显示了结果。

图 3. 卡其色背景上的标题

但我还没有完成。对于下一个示例,让我们实际将文本叠加在图像上,但使用半透明背景。

这更像是忍者 ImageMagick,所以它涉及几个步骤,第一步是识别原始源图像的宽度。这很容易做到


width=$(identify -format %w kids-party.png)

运行它,你会发现


$ echo $width
493

现在,让我们再次跳入 convert 命令,但这一次,让我们指定背景颜色、填充和一些其他内容,以使透明度正常工作


$ convert -background '#0008' -fill white -gravity center \
  -size ${width}x30 caption:AskDaveTaylor.com \
  kids-party.png +swap -gravity south -composite \
  party-watermark.png

我警告过你它会很复杂,对吧?让我们直接跳到结果,这样你就可以看到发生了什么(图 4)。

图 4. 改进的半透明标签

你可以尝试不同的背景和颜色,但现在,让我们使用这个,并跳到任务的第二部分,将此转换为一个脚本,该脚本可以修复文件夹中的一组图像。这个脚本的基本结构实际上很容易


for every image file
   calculate width
   create new watermarked version
   mv original to a hidden directory
   rename watermarked version to original image name
done

由于 Linux 非常“点文件”友好,让我们让脚本在当前文件夹中创建一个“.originals”文件夹,以便它是一个非破坏性的水印处理过程。这是脚本


savedir=".originals"
mkdir $savedir

if [ $? -ne 0 ] ; then
  echo "Error: failed making $savedir."
  exit 1
fi

for image in *png *jpg *gif
do
 if [ -s $image ] ; then   # non-zero file size
    width=$(identify -format %w $image)
    convert -background '#0008' -fill white -gravity center \
       -size ${width}x30 caption:AskDaveTaylor.com \
       $image +swap -gravity south -composite new-$image
     mv $image $savedir
     mv new-$image $image
    echo "watermarked $image successfully"
  fi
done

你可以看到它可以很容易地转换为脚本,只需将原始图像移动并保存在 .originals 中。

当我在特定目录中运行时,输出简洁明了


watermarked figure-01.png successfully
watermarked figure-02.png successfully
watermarked figure-03.png successfully
watermarked figure-04.png successfully

轻松完成。

你绝对可以在 ImageMagick 中进行更深入的水印处理,但我个人的偏好是利用已经在线的参考作品,包括这个有用的,尽管有点令人困惑的教程:https://imagemagick.org.cn/Usage/annotating。

无论你如何看待,如果你要以高分辨率在线提供你的图像,或者如果它们是独特的和受版权保护的知识产权,那么知道如何从命令行为它们添加水印是一项非常有用的技能。

Dave Taylor 长期以来一直在 UNIX 和 Linux 系统上编写 shell 脚本。他是 Learning Unix for Mac OS XWicked Cool Shell Scripts 的作者。你可以在 Twitter 上找到他 @DaveTaylor,你也可以通过他的技术问答网站联系他:Ask Dave Taylor

加载 Disqus 评论