使用 ImageMagick 的 Convert 命令给图片添加水印

给图片加个水印文本:“abcdefg”,原始文件1.jpeg,新文件11.jpeg,命令如下:

convert  -draw 'text 10,10 "abcdefg"'  -fill 'rgba(255, 255, 255, 1)'  -pointsize 28 -font Arial  -gravity SouthEast 1.jpeg  11.jpeg

上面参数的详细解释:

-draw:绘图选项,text 声明绘制文本, 10,10 声明文本距离图片东南角(SouthEast)的偏移值, abcdefg 声明绘制的文本,最好用引号包裹起来,避免输入特殊字符引起错误。绘制文本的格式为 text x,y string,当然还可以绘制其他类型,诸如圆 ( circle )、折线 ( polyline )。
-fill:对文本填充颜色,颜色是rgba(255,255,255,0.1)– r 代表红色,g 代表绿色,b 代表蓝色,a 代表 alpha。颜色255,255,255是白色。所以水印的颜色将为白色。对于黑色,请使用0,0,0. 我建议您在浅色背景上使用黑色水印,在深色背景上使用白色水印,以获得更好的对比度。Alpha 的范围是 0 到 1 – 0 表示完全透明,1 表示完全不透明。尝试使用这些值来达到您的喜好。
-pointsize:指定文本的字体大小。
-font:指定字体。
-gravity:设置文本在图片里的排列方式 ( 类似 CSS 里的 align-items + justify-content ),center 表示水平垂直都居中,其他值还可以是:NorthWest, North, NorthEast, West, East, SouthWest, South, SouthEast,不记大小写。

原始图:

使用 ImageMagick 的 Convert 命令给图片添加水印

打水印后的图:

使用 ImageMagick 的 Convert 命令给图片添加水印

这样就可以了,很遗憾现在不支持中文。

如果是加图片水印,可以看这篇文章:

利用convert命令加水印

其他例子

给图片打上倾斜平铺透明文本水印
convert -size 200x200 xc:none \
-fill '#d90f02' -pointsize 18 \
-gravity center -draw 'rotate -45 text 0,0 "moneyslow.com"' \
-resize 60% miff:- | composite -tile -dissolve 25 - src.png src_with_watermark.png
解释:文本平铺水印其实是将文本画成一张 png 图片,然后用这张透明图片在目标图片上进行平铺。

-size:设置画布的大小。
xc:全称 X Constant Image,是 canvas: 的别名,定义一张画布,用来绘图,常用格式为 xc:color,none 或者 transparent 设置画布为透明底,默认为白色。
-resize:该选项还可以指定百分比,意为缩放至原图像的百分之几。貌似 -pointsize 小于 14 后,-draw 里的 rotate 会不生效,所以用 -resize 来把平铺图案变得更小。
miff:-:
miff: 声明输出 ImageMagick ( IM ) 自己的图像文件格式:MIFF,主要用途是以复杂的方式处理图像时当做中间保存格式,适用于从一个 IM 命令向另一个 IM 命令传递图像元数据和其他关联属性。

在管道符前面意为将 IM 命令执行的结果作为标准输出,在管道符后面则表示从标准输入中读取这个数据,如在管道符后面的 composite 中使用 - 读取刚刚生成的透明图像。
|:Linux shell 管道符,用于将上一个命令的标准输出传递到下一个命令作为标准输入。这里将生成的水印图案传递给 composite 命令。
-tile:顾名思义,让图案平铺。
-dissolve:设置平铺图案的透明度

打上打上倾斜平铺透明文本水印:
convert -size 150x150 xc:none \
-fill '#d90f02' -pointsize 26 \
-gravity center -draw 'rotate -45 text 0,0 "SYH09"' \
-resize 60% miff:- | composite -tile -dissolve 40 - chusai.jpg 1_watermark.jpg

如果需要加中文字体,那么上面的命令就不灵了,需要用到另外一个命令mogrify,它的原理是把你需要加的水印文字(包含中文)写到一个文本文件(utf8编码)t.txt,把这个文本文件转换为一个透明图片,合成到原始图片中。命令如下:

mogrify -font msyh.ttf -pointsize 32 -fill black -weight bolder -gravity southeast -annotate +10+10 @"t.txt" 1.jpeg

上面命令中,msyh.ttf字体文件是支持中文的,需要你在自己电脑里找一下,比如我的mac电脑里的位置如下:
/Applications/Microsoft Word.app/Contents/Resources/DFonts/msyh.ttf
我把这个字体文件拷贝到当前文件夹下。
-pointsize设置字体大小,-font设置字体 -fill 是字体颜色 -gravity 是从哪个方位开始打水印,这里是右下角(东南),-annotate +10+10 是偏移量
注意,上面的命令是直接把1.jpeg覆盖了。

原图:

使用 ImageMagick 的 Convert 命令给图片添加水印

加水印(包含中文)后的图:

使用 ImageMagick 的 Convert 命令给图片添加水印

下面是参考文字:

1 图片水印处理
假设把名为logo.gif的水印图标添加在原始图片(src.jpg)右下角,且水印的下边缘距原始图片10像素、右边缘距原始图片5像素。使用如下命令即可:
convert src.jpg logo.gif -gravity southeast -geometry +5+10 -composite dest.jpg
2 文字水印处理
如果不含中文字符,可以直接通过convert draw text的方式将文字添加到图片,否则就需要使用其它的办法。命令行中不能包括中文字符,但是能通过读取文件的方式来操作,即先把中文信息保存文本文件中。注意:文本文件的编码最好用UTF-8,同时也需要选取一个支持中文的字体。直接把文本文本中的信息输出到图片上使用命令mogrify,不过也可以使用convert命令把文本文件中的信息生成一个图片,然后再把图片合成到原始图片中。下面分别介绍这几种方法。
不含中文字符:例如把www.cnblogs.com作为水印加上图片上,命令如下
convert src.jpg -gravity southeast -fill black -pointsize 16 -draw "text 5,5 'http://www.cnblogs.com/dying'" dest-c.jpg
mogrify -pointsize 16 -fill black -weight bolder -gravity southeast -annotate +5+5 "http://www.cnblogs.com/dying" src.jpg
说明:上述两条命令达到同样的结果,但是第一次命令可以保留原始图片,第二条是直接在原始图片上打上水印。
存在中文的情况:假设存有信息的文件叫t.txt,字体文件是msyh.ttf
复制代码
方法1:
//把文件t.txt中的信息生成图片txt.png, -transparent white让图片的背景透明,-size x30设置图片的高度,-pointsize设置字体大小,-font设置字体
convert -transparent white -font msyh.ttf -fill black -pointsize 24 label:@t.txt txt.png
//把txt.png合成到src.jpg上
convert src.jpg txt.png -gravity southeast -geometry +10+5 -composite dest.jpg
方法2:
convert src.jpg -transparent white -font msyh.ttf -fill black -pointsize 24 -size x30 label:@t.txt -gravity southeast -geometry +10+5 -composite dest.jpg
//southeast 图片的东南方向 上北下南左西右东
方法3:
mogrify -font msyh.ttf -pointsize 24 -fill white -weight bolder -gravity southeast -annotate +20+20 @"t.txt" src.jpg
复制代码
说明:上述第一、二种方法都有瑕疵,第二种背景不能变成透明,第一种虽然生成的图片可以透明,但是合成到原始图上效果不是很理想,第三种是完全透明的,所以推进用第三种方式来操作。
滚动至顶部