Linux 下给图片批量加水印

一个非盈利组织的项目负责人突发奇想想给他们网站上的每张照片加上水印,说实话那些照片都是平时活动、party 的生活照片用不着用水印那么夸张,第一次听说给生活照加水印的。没办法,谁让我们和他们有合作项目呢。还好他们服务器用的是 Linux,在 Linux 下给图片批量加水印简单多了,用 imagemagick + 一个小脚本搞定。

在 CentOS 下安装:

# yum install ImageMagick

在 Ubuntu 下安装:

$ sudo apt-get install imagemagick

先用画图工具制作好一个水印图片 watermark.jpg,然后执行 composite 命令把这个 watermark.jpg 水印加到图片 vpsee.jpg 上,-dissolve 15 是指 watermark.jpg 使用15%的透明附在原图上:

$ composite -gravity northeast -dissolve 15 watermark.jpg vpsee.jpg vpsee.jpg

要事先做个 watermark.jpg 好麻烦,有没有不用 watermark.jpg 直接加水印的方法?有,不过这种方法需要 Linux 系统上已经安装 True 字体(一般来说服务器都没有安装,不建议为了一个水印安装一个硕大的字体),以下命令把 vpsee.com 字符串加到 image.jpg 图片上:

$ mogrify -font /usr/share/fonts/truetype/thai/Purisa.ttf -pointsize 15 \
-verbose -draw "fill black text 5,23 'vpsee.com' \
fill orange text 6,24 'vpsee.com' " image.jpg

可以用下面的 shell script 对某个目录的所有图片加水印,需要注意的是处理带空白字符的文件名很麻烦,所以下面的脚本先处理空白字符,把包含空白字符的文件名用 “_” 字符替代,比如:image 1.jpg 替换成 image_1.jpg:

#!/bin/bash

echo "Image watermarking Script"
echo "http://www.vpsee.com"
echo ""

if [ $# -ne 2 ]
then
    echo "usage: ./watermark watermark.jpg picture_directory"
    echo ""
        exit
fi

MARK=$1
PICDIR=$2
for each in $PICDIR/*{.jpg,.jpeg,.png,.JPG,.JPEG,PNG}
do
    mv "$each" `echo $each | tr ' ' '_'`;
    composite -gravity northeast -dissolve 15.3 $MARK $each $each 2> /dev/null
    echo "$each: done!"
done
exit 0

imagemagick 的功能很强大,把上面脚本中的 composite 一行换成下面这行就成了批量给图片改大小了:

$ convert -resize 400 old_image.jpg new_image.jpg

如果想直接把原图改小,用新图片覆盖原图片的话:

$ convert -resize 400 image.jpg image.jpg

评论 (12 Comments)

  1. 本人做个实例,用php的gd库完成的,效果也很好的。php写的脚本。

  2. 很实用。
    不过有一个问题:CentOS和Ubuntu使用的安装程序的命令不一样,是不是很多命令都不相同?如果我只学习了一个linux的发行版,换到其他发行版是不是要从头开始学?

  3. 不是的,Linux 是组合起来的,命令都是 GNU 那一套,基本都是相同的,只是说每个发行版本的系统配置文件放的地方不同、配置脚本不同。
    不用从头学,就像 Windows XP 到 Vista 不用重头学一样,基本不变只是小地方有差异。

  4. 哦,是这样啊,你有没有什么可以推荐的发行版,服务器用的。
    谢谢。

  5. 我个人感觉Ubuntu的官方支持力度很大,但貌似还不成大气候。
    CentOS用的人多些,但听CB说这个项目的负责人跑路了……

  6. 一般来说 VPS 服务商提供的可选发行版就那么些,你可以多试试,然后选一个喜欢的。我一般用 CentOS/Debian/Fedora/Ubuntu.

  7. 那这几个里面有没有比较中意的?

  8. 偶一般选择debian和Ubuntu,安装什么的都比较方便。

  9. 有没办法,先判断下图片宽度,然后宽度大于400的才修改大小,不然小于400的,放大后就失真了

  10. […] 参考:http://www.vpsee.com/2009/09/resize-and-watermark-images-in-linux/ […]

  11. 我来做个不water的mark

  12. 可以尝试一下图形界面工具。
    http://www.acein.cn/other/java/iPhoto/

发表评论