ImageMagick 图片添加文字
用 ImageMagick 把文字烧进图片。用 -gravity 和 -annotate 定位、加投影保证可读、选字体,以及中文显示成方框的解决办法。
有两个参数能画文字:-annotate 和 -draw。用 -annotate —— 它支持 -gravity,意味着你不需要知道图片尺寸就能把文字定位到某条边上。
一行基础说明文字
magick input.jpg -gravity south -pointsize 48 -fill white \
-annotate +0+28 'Your caption here' output.jpg
设了 -gravity south 之后,偏移 +0+28 表示从底边向内 28 像素、水平居中。换个 gravity,同样的偏移就是从另一条边算起。
在任何底图上都看得清的文字
白字在明亮天空上会消失,黑字在阴影里会消失。把文字画两遍 —— 先画偏移一像素的深色,再在上面画真正的颜色:
magick input.jpg -gravity southeast -pointsize 42 \
-fill black -annotate +26+22 '© 2026 Your Name' \
-fill white -annotate +24+24 '© 2026 Your Name' output.jpg
成本很低,比猜一个颜色靠谱得多。另一种做法是在文字后面加一块半透明底:
magick input.jpg -gravity south -pointsize 36 \
-undercolor '#00000080' -fill white -annotate +0+24 'Caption' output.jpg
-undercolor 支持 8 位十六进制,最后两位就是透明度。
选字体
magick -list font
这会打印 ImageMagick 认识的所有字体。可以用字体族名,也可以直接给字体文件的完整路径:
magick input.jpg -font DejaVu-Sans-Bold -pointsize 48 \
-fill white -gravity center -annotate 0 'Hello' output.jpg
如果列表是空的
说明缺少 fontconfig 组件,或者机器上根本没装字体。精简版 Docker 镜像里非常常见。装一个:
apt install fonts-dejavu-core
中文显示成方框怎么办
字体加载是成功的,只是它没有这些字符的字形。默认字体只覆盖拉丁字母,所以中文、日文、韩文、阿拉伯文和 emoji 全都会显示成方框。用完整路径指定一个覆盖这些字形的字体:
apt install fonts-noto-cjk
magick input.jpg \
-font /usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc \
-pointsize 48 -fill white -gravity south -annotate +0+40 '你好世界' output.jpg
查找覆盖中文的字体:
fc-list :lang=zh
让文字大小跟着图片走
固定的 -pointsize 在 4000 像素的照片上小得看不见,在缩略图上又大得离谱。要么在脚本里算,要么让 ImageMagick 把文字自动适配到一个框里:
magick input.jpg -gravity south -size 1000x120 \
-background none -fill white label:'Fitted caption' \
-composite output.jpg
label: 会自动选一个刚好装得进给定 -size 的字号。
生成一张纯文字图片
magick -background none -fill '#0d9488' -pointsize 96 \
label:'MagickCmd' output.png