画像に文字を描画する

コマンドラインImageMagick を使って画像の上に文字を描画する方法。

# input.jpg の上から Arial 12pt 赤色で 「sample」という文字を
# 画像の下部に描画して output.jpg という名前で保存する
$ convert -font Arial-Normal -pointsize 12 -gravity south -annotate 0 "sample" -fill red input.jpg output.jpg

# south の位置から x 方向に -100px 、 y 方向 100px だけ移動させる
# ただしこのとき y は下から上が正方向
$ convert -font Arial-Normal -pointsize 12 -gravity south -annotate 0x0-100+100 "sample" -fill red input.jpg output.jpg

# file.txt の内容を描画する
$ convert -font Arial-Normal -pointsize 12 -gravity south -annotate 0 "@file.txt" -fill red input.jpg output.jpg

convert ですので、同時にリサイズを行う -geometry なども指定できますが -geometry が先だとまずリサイズを行ったのちに文字描画が行われます。逆だと描画した文字もリサイズの対象となります。目的によって引数の順番なども意識する必要があります。

$ convert -list font

とすると、利用できるフォントの一覧が出力されるのでその中から "Font:" の行に書かれているフォント名を選ぶか、直接フォントファイル (*.ttf など) を指定します。

描画する位置は -gravity position で指定します。今回のように south と指定すると画像の下部に描画されます。

文字の描画は -annotate degrees text もしくは -annotate degreesxdegrees{+-}tx{+-}ty text という形式で指定します。 degrees だけ傾けて text を描画します。まったく傾けない(横書き)なら 0 にします。

-gravity で指定した位置を基準にして前後左右に移動させたいときは後者の形式を使って txty で移動する距離を指定します。移動する方向は -gravity が east 系なら右から左が正に、 south 系なら下から上が正になるようです。

-annotate で与える文字列は UTF-8 である必要があります。 UTF-8 で値を渡せないときは一旦テキストファイルにして nkf などで UTF-8 に変換すると問題ありません。 text@ から始まる文字列にすると、そのファイルの内容を描画します。